Pagini recente » Cod sursa (job #2129129) | Cod sursa (job #2193048) | Cod sursa (job #521346) | Cod sursa (job #1560178) | Cod sursa (job #2072991)
//APM - Kruskal
#include <stdio.h>
#include <algorithm>
using namespace std;
struct muchie
{
int x,y,c;
} u[400001], a[400001];
int m,n;
FILE *f=fopen("apm.in","r");
FILE *g=fopen("apm.out","w");
int comp(muchie a, muchie b)
{
return a.c<b.c;
}
void citire()
{int i;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=m;i++)
fscanf(f,"%d %d %d",&u[i].x,&u[i].y,&u[i].c);
}
int main()
{int i,j,l[200001],ct,k,v,w;
citire();
sort(u+1,u+m+1,comp); // sortez vectorul de muchii crescator dupa cost
for (i=1;i<=n;i++) l[i]=i; // vf i face parte din subarborele i
ct=0;
k=0;
i=1;
while (k<n-1) //se aleg n-1 muchii
{ w=l[u[i].x];
v=l[u[i].y];
if (v!=w)// daca extremitatile muchiei nu fac parte din acelasi subarbore
{
ct+=u[i].c;
a[++k]=u[i]; // retin muchia adaugata la APM
for (j=1;j<=n;j++) // unific cei doi subarbori
if (l[j]==v) l[j]=w;
}
i++; // trece la urmatoarea muchie
}
fprintf(g,"%d\n%d\n",ct,k);
for (i=1;i<=k;i++) fprintf(g,"%d %d\n",a[i].x,a[i].y);
return 0;
}