Cod sursa(job #1426515)

Utilizator AnaPPantilie Ana AnaP Data 29 aprilie 2015 20:34:46
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;

int repr_m_disj(unsigned int *M, unsigned int v)
{
    if(M[v]!=v)
        M[v]=repr_m_disj(M, M[v]);
    return M[v];
}

bool comp(pair<pair<unsigned int,unsigned int>,unsigned int> x, pair<pair<unsigned int,unsigned int>,unsigned int> y)
{
    return x.second<y.second;
}

int main()
{
    vector<pair<pair<unsigned int,unsigned int>,unsigned int> >G;
    vector<pair<pair<unsigned int,unsigned int>,unsigned int> >T;
    unsigned int *M, nr_v, nr_m;
    cin>>nr_v>>nr_m;
    for(unsigned int i=0;i<nr_m;i++)
    {
        unsigned int v1, v2, c;
        cin>>v1>>v2>>c;
        G.push_back(make_pair(make_pair(v1,v2),c));
    }
    M=new unsigned int[nr_v];
    for(unsigned int i=1;i<=nr_v;i++)
        M[i]=i;
    sort(G.begin(), G.end(), comp);
    for(unsigned int i=0; i<nr_m || T.size()!=nr_v-1 ;i++)
    {
        unsigned int repr_v1, repr_v2, v1, v2;
        v1=G[i].first.first;
        v2=G[i].first.second;
        repr_v1 = repr_m_disj(M, v1);
        repr_v2 = repr_m_disj(M, v2);
        if(repr_v1 != repr_v2)
        {
            T.push_back(G[i]);
            M[repr_v1]=M[repr_v2];
        }
    }
    for(unsigned int i=0;i<nr_v-1;i++)
        cout<<T[i].first.first<<" "<<T[i].first.second<<" "<<T[i].second<<endl;
    return 0;
}