Маршруты на графах

advertisement
Маршруты на графах
Нахождение компонент связности
Поиск маршрутов, удовлетворяющим
определённым требованиям
Кратчайшие маршруты
Обход графа и в ширину и в
глубину
Вход: граф 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;
#define inf = 10000;
for(i=1;i<=n;i++)
int n, i, j, mind, minv;
if((d[i] < mind) && !s[i]) {
int c[200,200];
mind=d[i];
int s[200];
minv=i;
int d[200];
}
s[minv]=1;
for(i=1;i<=n;i++)
for(i=1;i<=n;i++) s[i]=0;
if((d[i]-d[minv]>c[minv,i]) && !s[i])
d[i] = d[minv]+c[minv,i];
}
}
Алгоритм Флойда
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;
}
}
Download