/** Алгоритъм на Прим за минимално покриващо дърво с корен s (с priority_queue) */ #include #include #include #include #define Inf 2000000000 using namespace std; typedef pair pr; const int n = 8; vector graph[n] = { { pr(1, 1), pr(3, 3), pr(4, 5) }, { pr(0, 1), pr(2, 2), pr(5, 2) }, { pr(1, 2), pr(4, 6) }, { pr(0, 3), pr(6, 10) }, { pr(0, 5), pr(2, 6), pr(6, 7), pr(7, 2) }, { pr(1, 2), pr(7, 5) }, { pr(3, 10), pr(4, 7), pr(7, 20) }, { pr(4, 2), pr(5, 5), pr(6, 20) } }; bool finalized[n]; int key[n]; int parent[n]; int MST_Prim(int s) { for (int i = 0; i < n; i++){ key[i] = Inf; finalized[i] = false; parent[i] = -1; } priority_queue, vector >, greater > > q; // minHeap q.push(pair(0, s)); key[s] = 0; int sum = 0; while (!q.empty()) { int u = q.top().second; q.pop(); if (!finalized[u]) { finalized[u] = true; sum += key[u]; for (pr e : graph[u]) { int v = e.first, w = e.second; if (!finalized[v] && w < key[v]) { parent[v] = u; key[v] = w; q.push(pair(key[v], v)); } } } } return sum; } int main() { cout << "MPD_Sum = " << MST_Prim(0) << endl; return 0; }