Алгоритм Прима
Необходимо в заданном графе найти дерево, содержащее все вершины графа и имеющее минимальный суммарный вес рёбер.
Алгоритм Прима жадный - на каждой итерации необходимо добавлять ребро минимального веса, связывающее вершину, непринадлежащую дереву, с деревом.
Реализации алгоритмов Прима и Дейкстры различаются буквально тремя строчками.
Асимптотика O(N2).
Листинг C++
const int inf = 1e9;
void prim (int x, vector < vector < int > > &D, vector < int > &w, vector < int > &p)
{
// initialization
int i, j;
int n = D.size ();
vector < int > a (n, 0);
w.assign (n, inf);
p.assign (n, x);
for (i = 0; i < n; ++ i)
w[i] = D[x][i];
a[x] = 1;
w[x] = 0;
p[x] = - 1;
for (i = 0; i < n; ++ i)
{
// iMin - the closest not considered vertice
int iMin = - 1, Min = inf;
for (j = 0; j < n; ++ j)
if (!a[j] && w[j] < Min)
{
iMin = j;
Min = w[j];
}
if (iMin == - 1)
return;
a[iMin] = 1;
// relaxation
for (j = 0; j < n; ++ j)
if (w[j] > D[iMin][j])
{
w[j] = D[iMin][j];
p[j] = iMin;
}
}
}
21.05.2007, 18:43
По всем вопросам обращаться: rumterg@gmail.com