Cod sursa(job #1260320)

Utilizator ZenusTudor Costin Razvan Zenus Data 11 noiembrie 2014 08:50:06
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <vector>
#include <cstdio>
#include <algorithm>

using namespace std;

#define NMAX 200007
#define S second
#define F first

int X,Y,cost,M,N,total,i;
vector < pair < int , pair < int , int > > > w;
vector < pair < int , int > > sol;
int T[NMAX];

int multime(int node)
{
    int rang;

    (T[node]==node) ? rang=node : rang=multime(T[node]);
    T[node]=rang;

    return T[node];
}

int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);

for (scanf("%d%d",&N,&M);M;--M)
{
    scanf("%d%d%d",&X,&Y,&cost);
    w.push_back(make_pair(cost,make_pair(X,Y)));
}

for (i=1;i<=N;++i) T[i]=i;

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

for (i=0;i<w.size();++i)
{
    if (multime(w[i].S.F)==multime(w[i].S.S)) continue;
    T[multime(w[i].S.S)]=w[i].S.F;

    sol.push_back(make_pair(w[i].S.F,w[i].S.S));
    total+=w[i].F;
}

for (printf("%d %d\n",total,sol.size()),i=0;i<sol.size();++i)
printf("%d %d\n",sol[i].F,sol[i].S);

return 0;
}