Cod sursa(job #1005746)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 5 octombrie 2013 18:06:30
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define NMAX 200000+5
#define MMAX 400000+5
#define make(a,b,c) make_pair(make_pair(a,b),c)
#define muchie pair<pair<int,int>,int>
using namespace std;
int N,M,Total,Nr;
int root[NMAX];
bool Marcaj[MMAX];
vector<muchie> E;
int crit(muchie A,muchie B){return A.second<=B.second;}
int find(int x)
{
    if(root[x]!=x) root[x]=find(root[x]);
    return root[x];
}
void unite(int x,int y)
{
    root[x]=y;
}
int main()
{
    int i,x,y,a,b,c;
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(i=1;i<=N;i++) root[i]=i;
    for(i=1;i<=M;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        E.push_back(make(a,b,c));
    }
    sort(E.begin(),E.end(),crit);
    for(i=0;i<M;i++)
    {
        x=find(E[i].first.first);
        y=find(E[i].first.second);
        if(x==y) continue;
        unite(x,y);
        Total+=E[i].second;
        Marcaj[i]=1;
        Nr++;
    }
    printf("%d\n%d\n",Total,Nr);
    for(i=0;i<M;i++)
    {
        if(!Marcaj[i]) continue;
        printf("%d %d\n",E[i].first.first,E[i].first.second);
    }
    return 0;
}