fbpx

Problema #590 – Prim – Rezolvari PBInfo

de Mihai-Alexandru

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] << " ";
}
Comentarii

S-ar putea sa iti placa