Cod sursa(job #1260797)

Utilizator cristigrigoreGrigore Cristan Andrei cristigrigore Data 11 noiembrie 2014 16:37:42
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
int i,j,m,n,x,y,c,s,l1,l2,n1,nr,k1,xx,xx1,k,n2,a[200002],z1[200002],z2[200002];
vector <pair<int,pair<int,int> > > p;
vector <pair<int,pair<int,int> > >::iterator it;
vector <int> v[200002];
vector <int>::iterator it1;
bool ok[200002],ok1;
int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&x,&y,&c);
        p.push_back(make_pair(c,make_pair(x,y)));
    }
    for(i=1; i<=n; i++)
    a[i]=i;
    sort(p.begin(),p.end());
    for(it=p.begin(); it!=p.end(); it++)
    {
        c=(*it).first;
        n1=((*it).second).first;
        n2=((*it).second).second;
        if(!ok[n1])
        {
            s+=c;
            z1[++k1]=n1;
            z2[k1]=n2;
            nr++;
            a[n1]=a[n2]=a[n2];
            ok[n1]=ok[n2]=true;
        }
        else
        if(!ok[n2])
        {
            s+=c;
            z1[++k1]=n1;
            z2[k1]=n2;
            nr++;
            a[n1]=a[n2]=a[n1];
            ok[n1]=ok[n2]=true;
        }
        else
        {
            xx=a[n2];
            xx1=a[n1];
            if(a[n1]!=a[n2])
            {for(i=1; i<=n; i++)
            if(a[i]==xx) a[i]=xx1;
            s+=c;
            z1[++k1]=n1;
            z2[k1]=n2;
            nr++;
            }

        }
    }
    printf("%d\n%d\n",s,nr);
    for(i=1; i<=nr; i++)
    printf("%d %d\n",z2[i],z1[i]);

    return 0;
}