Алгоритм Форда-Беллмана
Необходимо найти кратчайшие расстояния в графе от заданной вершины до всех остальных
Алгоритм основан на динамическом программировании, поэтому работает для любых графов. С помощью него так же можно находить циклы отрицательного веса.
Асимптотика
- Граф задан матрицей весов O(N3)
- Граф задан списком рёбер O(NM)
void ford_bellman (int x, vector < vector < int > > &D,
vector < int > &w, vector < int > &p)
{
int i, j, k;
int n = D.size ();
w.assign (n, 0);
p.assign (n, - 1);
for (i = 0; i < n; ++ i)
w[i] = D[x][i];
w[x] = 0;
for (k = 0; k < n; ++ k)
for (i = 0; i < n; ++ i)
for (j = 0; j < n; ++ j)
if (w[i] > w[j] + D[j][i])
{
w[i] = w[j] + D[j][i];
p[i] = j;
}
}
Листинг C++ - список рёбер
const int inf = 1e9;
void ford_bellman (int x, vector < vector < int > > &R, int n,
vector < int > &w, vector < int > &p)
{
int i, j;
int m = R.size ();
w.assign (n, inf);
p.assign (n, - 1);
w[x] = 0;
for (i = 0; i < n; ++ i)
for (j = 0; j < m; ++ j)
if (w[R[j][1]] > w[R[j][0]] + R[j][2])
{
w[R[j][1]] = w[R[j][0]] + R[j][2];
p[R[j][1]] = R[j][0];
}
}
19.05.2007, 14:41
По всем вопросам обращаться: rumterg@gmail.com