Cod sursa(job #1046700)

Utilizator roparexRoparex roparex Data 3 decembrie 2013 13:00:23
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
//appm unificare pe verticala
//cu coada cu prioritate
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct muchie{int x,y,c;};
vector<pair<int,int> >sol;
struct compar{
    bool operator() (muchie a,muchie b)
    {
        return b.c<a.c;
    }
};
int ct,nr,n,m,i,t[205000],u,v,CT,h[200000],h1,h2;
priority_queue<muchie,vector<muchie>,compar> CP;
int radacina (int x)
{
   while (t[x]!=0) x=t[x];
   return x;
}
int main ()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%ld%ld",&n,&m);
    muchie e;
    for(i=1;i<=m;i++)
    {
        scanf("%ld%ld%ld",&e.x,&e.y,&e.c);
        CP.push(e);
    }
    while(nr<n-1)
    {
        e=CP.top();
        CP.pop();
        u=radacina(e.x);
        v=radacina(e.y);
        if(u!=v)
        {
            sol.push_back(make_pair(e.x,e.y));
            CT=CT+e.c;
            nr++;
            h1=h[u];
            h2=h[v];
            if(h1<h2)
                t[u]=v;
            else
            {
                if(h2<h1)
                    t[v]=u;
                else
                {
                    t[v]=u;
                    h[u]++;
                }
            }
        }
    }
    printf("%ld\n",CT);
    printf("%ld\n",nr);
    for(i=0;i<sol.size();i++)
        printf("%ld %ld\n",sol[i].first,sol[i].second);
}