Pagini recente » Cod sursa (job #123382) | Cod sursa (job #1943998) | Cod sursa (job #1526172) | Cod sursa (job #872347) | Cod sursa (job #584661)
Cod sursa(job #584661)
#include <fstream>
#include <algorithm>
using namespace std;
FILE *f=fopen("apm.in","r"),*g=fopen("apm.out","w");
int n,m,t[200001],i,nrc,rg[200001],ales[400001],cost;
struct muchie
{
int y,x,c;
};
muchie l[400001];
int cmp(muchie a,muchie b)
{
return (a.c<b.c);
}
int rad(int x)
{
int r=x,y;
while (t[r]!=r)
r=t[r];
while (t[x]!=x)
{
y=t[x];
t[x]=r;
x=y;
}
return r;
}
int unite(int x,int y)
{
nrc--;
if (rg[rad(x)]>rg[rad(y)])
t[rad(y)]=x;
else
t[rad(x)]=y;
if (rg[rad(x)]==rg[rad(y)])
rg[rad(y)]++;
return 0;
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++)
fscanf(f,"%d%d%d",&l[i].x,&l[i].y,&l[i].c);
nrc=n;
for (i=1;i<=n;i++)
{
t[i]=i;
rg[i]=1;
}
i=1;
sort(l+1,l+m+1,cmp);
while (nrc>1)
{
while (rad(l[i].x)==rad(l[i].y))
i++;
unite(l[i].x,l[i].y);
ales[++ales[0]]=i;
cost+=l[i].c;
i++;
}
fprintf(g,"%d\n%d\n",cost,ales[0]);
for (i=1;i<=ales[0];i++)
{
fprintf(g,"%d %d\n",l[ales[i]].x,l[ales[i]].y);
}
fclose(g);
return 0;
}