Маршруты на графах Нахождение компонент связности Поиск маршрутов, удовлетворяющим определённым требованиям Кратчайшие маршруты
Обход графа и в ширину и в глубину Вход: граф 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 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
Расстояние между вершинами на графе n n Граф без весов рёбер – алгоритм просмотра в ширину Взвешенный граф: n n Алгоритм Дейкстры Алгоритм Флойда
Алгоритм Дейкстры 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++) 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; } }