Cod sursa(job #772304)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 29 iulie 2012 00:35:26
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
/*Arbore partial de cost minim*/
   /*Krukskal*/

#include<stdio.h>
using namespace std;


int v[400001],x[400001],y[400001],counter;
int root[200001], size[200001];
int xa[200001], ya[200001];
long long sum;

int find(int g)
{int r;
 r=g;
 while(root[r]!=r)
    r=root[r];
 
 int q,p;
 q=g;
 while(root[q]!=q)
   {p=root[q];
    root[q]=r;
    q=p;}
  
 return r;}
 
void unite(int f, int g)
{int rf,rg;
 rf=find(f);
 rg=find(g);
 if(size[rf]>size[rg])
    root[rg]=root[rf];
 else
    root[rf]=root[rg];
 
 if(size[rf]==size[rg])
   size[rg]++;         
}  


int n,m,i,j;
int main()
{int xx,yy,zz,poz;
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", &xx, &yy, &zz);
   v[i]=zz;   
   x[i]=xx;
   y[i]=yy;
  }
  
int change=1,aux;
while(change==1)
{change=0;
 for(i=1; i<=m-1; i++)
   if(v[i]>v[i+1])
     {aux=v[i+1];
     v[i+1]=v[i];
     v[i]=aux;
     aux=x[i+1];
     x[i+1]=x[i];
     x[i]=aux;
     aux=y[i+1];
     y[i+1]=y[i];
     y[i]=aux;
     change=1;}
}
  
for(i=1; i<=n; i++)
 {root[i]=i;
  size[i]=1;}  
  
for(i=1; i<=m; i++)
  {if(find(x[i])!=find(y[i]))
    {unite(x[i],y[i]);
    sum+=v[i];
    counter++;
    xa[counter]=x[i];
    ya[counter]=y[i];
    if (counter==(n-1))
      break;}  
  }    
printf("%d\n",sum);
printf("%d\n",n-1);
for(i=1; i<=n-1; i++)
 printf("%d %d\n",ya[i],xa[i]);
return 0;}