Cerința
Se dă un graf neorientat ponderat conex cu n
vârfuri și m
muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Prim, determinați un arbore parțial de cost minim, cu rădăcina în vârful 1
.
Date de intrare
Fișierul de intrare prim.in
conține pe prima linie numerele n m
, iar următoarele linii câte un triplet i j c
, cu semnificația: există muchia (i j)
și are costul c
.
Date de ieșire
Fișierul de ieșire prim.out
va conține pe prima linie costul arborelui de cost minim determinat, iar pe a doua linie vectorul de tați al arborelui, cu elementele separate prin exact un spațiu.
Restricții și precizări
1 ≤ n ≤ 100
- costul unei muchii va fi mai mic decât
1000
Exemplu
prim.in
7 11 1 2 2 1 7 4 2 3 3 2 5 2 2 6 3 2 7 3 3 4 1 3 5 2 4 5 1 5 6 3 6 7 5
prim.out
12 0 1 4 5 2 2 2
#include <bits/stdc++.h> using namespace std; ifstream cin("prim.in"); ofstream cout("prim.out"); vector <pair<int , int>> G[101]; int n , m , x , y , c , S; vector<int> T , D; vector<bool>V; int main() { for(cin >> n >> m ; m ; --m) { cin >> x >> y >> c; G[x].push_back({c , y}); G[y].push_back({c , x}); } priority_queue < pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>> >Q; V.resize(n + 1 , false); T.resize(n + 1 , -1); D.resize(n + 1 , 0x3f3f3f3f); V[1] = true; T[1] = 0; D[1] = 0; for(auto x : G[1]) { T[x.second] = 1; D[x.second] = x.first; Q.push(x); } for(int k = 1 ; k < n ; k++) { pair<int , int> P; do{ P = Q.top(); Q.pop(); }while(V[P.second]); V[P.second] = true; S += P.first; for(auto x : G[P.second]) if(V[x.second] == false && D[x.second] > x.first) { T[x.second] = P.second; D[x.second] = x.first; Q.push(x); } } cout << S << '\n'; for(int i = 1 ;i <= n ; i++) cout << T[i] << " "; }