70 likes | 236 Views
Маршруты на графах. Нахождение компонент связности Поиск маршрутов, удовлетворяющим определённым требованиям Кратчайшие маршруты. Обход графа и в ширину и в глубину. Вход : граф G(V,E), начальная вершина x V for v V do s[v] := 0 x T (* поместить x в структуру T *)
E N D
Маршруты на графах Нахождение компонент связности Поиск маршрутов, удовлетворяющим определённым требованиям Кратчайшие маршруты
Обход графа и в ширину и в глубину Вход: граф G(V,E), начальная вершина x V for v V do s[v] := 0 x T (* поместить x в структуру T *) s[x]:=1 while T do u T (* извлекаем вершину из T*) выдать u for w Г(u) do (* Г(u) – вершины, смежные u *) if s[w] = 0 then w T s[w] := 1 end if end for end while
Нахождение компонент связности Вход: граф G(V,E), начальная вершина x V T = {x} S = while T S do u T / S (* извлекаем вершину из T*) S := S { u } T := T Г(u) (* Г(u) – вершины, смежные u *) end while
Нахождение компонент сильной связности procedure kss if T = then return v T; v T if Г[v] V = then C:=C M[v] V:=V \ {v} v T kss else for u Г[v] do if e[u] = 0 then u T e[u]:=1 else repeat w T V:=V \ {w} Г[u]:=Г[u]Г[w] M[u]:=M[u]M[w] until u=w w T V:=V {w} end if kss end for end if C := for v V do M[v] := {v} e[v] := 0 end for while V do select v V T v e[v]:=1 kss end while
Расстояние между вершинами на графе • Граф без весов рёбер – алгоритм просмотра в ширину • Взвешенный граф: • Алгоритм Дейкстры • Алгоритм Флойда
Алгоритм Дейкстры void dist(int x) { int y,p; for(i=1;i<=n;i++) d[i]=c[x,i]; d[x]:=0; s[x]:=1; for(j=2;j<=n;j++) { mind=inf; for(i=1;i<=n;i++) if((d[i] < mind) &&!s[i]) { mind=d[i]; minv=i; } s[minv]=1; for(i=1;i<=n;i++) if((d[i]-d[minv]>c[minv,i]) &&!s[i]) d[i] = d[minv]+c[minv,i]; } } Матрицей смежности задан взвешенный граф. Отсутствие ребра задаётся бесконечностью. #define inf = 10000; int n, i, j, mind, minv; int c[200,200]; int s[200]; int d[200]; for(i=1;i<=n;i++)s[i]=0;
Алгоритм Флойда void dist() { long r; for(i=1;i<=n;i++) for(j=1;j<=n;j++) d[i,j]=c[i,j]; for(i=1;i<=n;i++) d[i,i]=0; for(m=1;m<=n;m++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { r=d[i,m]+d[m,j]; if(d[i,j]>r) d[i,j]=r; } }