Cod sursa(job #1537417)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 27 noiembrie 2015 11:25:07
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <utility>
#include <limits>
using namespace std;

typedef pair<int,pair<int,int>> PIPII;

const int INF = numeric_limits<int>::max()>>1;

vector<int> parent,rnk;

int Find(int x)
{
    int a=x;
    while(a!=parent[a]) a=parent[a];
    while(x!=a){
        int b=parent[x];
        parent[x]=a;
        x=b;
    }
}

void Union(int x, int y)
{
    int rx=Find(x), ry=Find(y);
    if(rx!=ry){
        if(rnk[rx]<rnk[ry]) parent[rx]=ry;
        else if(rnk[rx]>rnk[ry]) parent[ry]=rx;
        else{ parent[rx]=ry; rnk[ry]++;}

    }
}



int main()
{
    ifstream fin("apm.in");
    ofstream fout("apm.out");

    int n,m; fin>>n>>m;

    parent.resize(n+1); rnk.resize(n+1);
    for(int i=1;i<=n;++i){parent[i]=i; rnk[i]=0;}

    vector<PIPII> edg(m);
    for(int i=0;i<m;++i){
        fin>>edg[i].second.first;
        fin>>edg[i].second.second;
        fin>>edg[i].first;
    }

    sort(edg.begin(),edg.end());

    int sum=0,cnt=0;

    for(int i=0;i<m;++i){
        int a=edg[i].second.first, b=edg[i].second.second;
        int pa=Find(a), pb=Find(b);

        if(pa==pb) edg[i].first=INF;
        else{
            sum+=edg[i].first;
            ++cnt;
            Union(pa,pb);
        }
    }

    fout<<sum<<'\n'<<cnt<<'\n';
    for(int i=0;i<m;++i) if(edg[i].first!=INF)
        fout<<edg[i].second.first<<' '<<edg[i].second.second<<'\n';

}