Маршруты на графах Нахождение компонент связности Поиск маршрутов, удовлетворяющим определённым требованиям Кратчайшие маршруты Обход графа и в ширину и в глубину Вход: граф G(V,E), начальная вершина x V for v V do s[v] := 0 x T (* поместить x в структуру T *) s[x]:=1 while T do uT (* извлекаем вершину из T *) выдать u for w Г(u) do (* Г(u) – вершины, смежные u *) if s[w] = 0 then wT s[w] := 1 end if end for end while Нахождение компонент связности Вход: граф G(V,E), начальная вершина x V T={x} S= while T S do uT/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} vT kss else for u Г[v] do if e[u] = 0 then uT e[u]:=1 else repeat wT V:=V \ {w} Г[u]:=Г[u]Г[w] M[u]:=M[u]M[w] until u=w wT 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 Tv 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; } }