fbpx

Problema #592 – Kruskal – 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 Kruskal, determinați un arbore parțial de cost minim.

Date de intrare

Fișierul de intrare kruskal.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 kruskal.out va conține pe prima linie costul arborelui de cost minim determinat, iar pe următoarele n-1 linii câte o pereche de numere i j, cu semnificația că muchia (i j) aparține arborelui parțial de cost minim determinat.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • costul unei muchii va fi mai mic decât 1000

Exemplu

kruskal.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

kruskal.out

12
3 4
4 5
1 2
2 5
2 6
2 7
#include <bits/stdc++.h>

using namespace std;

ifstream cin("kruskal.in");
ofstream cout("kruskal.out");

int n , m , x , y , w , T[1001] , rez , cnt;
struct poz
{
    int i , j , c;
}M[1001];

poz A[1001];

int leaga(int a , int b)
{
    T[a] = T[b];
}

int radacina(int a)
{
    if(a == T[a]) return a;
    else return T[a] = radacina(T[a]);
}

void kruskal()
{
    int r1 , r2;
    for(int i = 1 ; i <= m ; i++)
    {
        r1 = radacina(M[i].i);
        r2 = radacina(M[i].j);
        if(r1 != r2)
        {
            rez += M[i].c;
            A[++cnt] = M[i];
            leaga(r1 , r2);
        }
    }
}

int comp(poz a , poz b)
{
    return a.c < b.c;
}

void init()
{
    for(int i = 1 ; i <= n ; i++)
        T[i] = i;
}

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y >> w;
        M[i].i = x , M[i].j = y , M[i].c = w;
    }
    sort(M + 1 , M + m + 1 , comp);
    init();
    kruskal();
    cout << rez << '\n';
    for(int i = 1 ; i < n ; i++)
        cout << A[i].i << " " << A[i].j << '\n';
}
Comentarii

S-ar putea sa iti placa