Pagini recente » Cod sursa (job #172203) | Cod sursa (job #1238250) | Cod sursa (job #2885969) | Cod sursa (job #2302595) | Cod sursa (job #772304)
Cod sursa(job #772304)
/*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;}