Cod sursa(job #1167434)

Utilizator costyv87Vlad Costin costyv87 Data 4 aprilie 2014 23:38:20
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
//HighFLow
#include <cstdio>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
FILE *f,*g;
#define ll (long long)
#define fcat(c) while (c!='\n') fscanf(f,"%c",&c);
#define cat(c) while(c!='\n') scanf("%c",&c);
int T[200200],Y[200200];
int i,x,y,z,s,n,m;
vector <pair<int,int> > sol;

struct cp{int x,y,z;
          cp(){}
          cp(int a,int b,int c)
          {
              x=a;
              y=b;
              z=c;
          }
            };
vector <cp> E;

void unite(int x,int y)
{
    if (Y[x]<Y[y])
        T[x]=y;
    else
        T[y]=x;

    if (Y[x]==Y[y]) Y[x]++;
}

int rad(int x)
{
    int y,z;

    for (y=x;T[y]!=y;y=T[y]) ;

    for (;T[x]!=x;)
    {
        z=T[x];
        T[x]=y;
        x=z;
    }

    return y;
}


bool cmp(cp x,cp y)
{
    return (x.z<=y.z);
}

int main()
{
	f=fopen("apm.in","r");
	g=fopen("apm.out","w");

    fscanf(f,"%d%d",&n,&m);

    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&x,&y,&z);
        E.push_back(cp(x,y,z));
    }

    stable_sort(E.begin(),E.end(),cmp);

    for (i=1;i<=n;i++) T[i]=i,Y[i]=1;

    for (i=0;i<m;i++)
    {
        if ( rad(E[i].x)!=rad(E[i].y))
            {
                unite(rad(E[i].x),rad(E[i].y));
                s+=E[i].z;
                sol.push_back(make_pair(E[i].x,E[i].y));
            }
    }

    fprintf(g,"%d\n",s);
    fprintf(g,"%d\n",sol.size());
    for (i=0;i<sol.size();i++) fprintf(g,"%d %d\n",sol[i].first,sol[i].second);

	return 0;
}