Алгоритм Краскала



Необходимо в заданном графе найти дерево, содержащее все вершины графа и имеющее минимальный суммарный вес рёбер

Жадно добавляем рёбра. Для эффективности используем систему непересекающихся множеств.

Асимптотика O(MlogM).


Листинг C++

class edge 
{
public :
    int i, j, r;
    edge (int _i = 0, int _j = 0, int _r = 0) : i (_i), j (_j), r (_r) {};
};
bool operator < (edge a, edge b) { return a.r < b.r; }

int kruskal (int n, vector < edge > R, vector < edge > &res)
{
    int weight = 0;
    res.assign (n, 0);
    diset s = diset (n);
    sort (R.begin (), R.end ());

    for (int i = 0; i < R.size (); ++ i)
        if (s.find_set (R[i].i) != s.find_set (R[i].j))
        {
            weight += R[i].r;
            res.push_back (R[i]);
            s.union_set (R[i].i, R[i].j);
        }
    return weight;
}

31.08.2008, 16:32


По всем вопросам обращаться: rumterg@gmail.com