Pagini recente » Cod sursa (job #1678977) | Cod sursa (job #1127171) | Cod sursa (job #1895039) | Cod sursa (job #2710801) | Cod sursa (job #916319)
Cod sursa(job #916319)
#include <stdio.h>
#include <algorithm>
#define NMAX 10003
#define MMAX 400003
FILE *fin,*fout;
using namespace std;
//ifstream fin("flood.in");
//ofstream fout("flood.out");
struct muchie {int x,y,cost; bool ok;};
muchie Muchie[MMAX];
void citire();
void apm();
int n,m,Tata[NMAX],H[NMAX],drumuri,ctotal;
bool comp(muchie a, muchie b)
{
return a.cost<b.cost||(a.cost==b.cost &&a.x<b.x);
}
int main()
{
int i;
citire();
sort(Muchie+1,Muchie+m+1,comp);
apm();
}
void citire()
{
fin=fopen("apm.in","r");
fout=fopen("apm.out","w");
int a,b,c,i;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&a,&b,&c);
Muchie[i].x=a;
Muchie[i].y=b;
Muchie[i].cost=c;
Muchie[i].ok=0;
}
}
void Union(int i, int j)
{
if(H[i]<H[j]) Tata[i]=j;
else
if(H[i]>H[j]) Tata[j]=i;
else {Tata[j]=i;H[i]++;}
}
int Find(int care)
{
int aux,rad;
rad=care;
while(Tata[rad]!=0) rad=Tata[rad];
// compresia drumului
while(care!=rad) {H[care]=0; aux=Tata[care]; Tata[care]=rad; care=aux; }
return rad;
}
void apm()
{
int k,cx,cy,i;
int poz=1;
for(k=1; k<=n-1; )
{
cx=Find(Muchie[poz].x);
cy=Find(Muchie[poz].y);
if(cx!=cy)
{
drumuri++;
ctotal+=Muchie[poz].cost;
Muchie[poz].ok=1;
k++;
Union(cx,cy);
}
poz++;
}
fprintf(fout,"%d\n%d\n",ctotal,drumuri);
for(i=1;i<=m;i++)
if(Muchie[i].ok==1)
fprintf(fout,"%d %d\n",Muchie[i].y,Muchie[i].x);
}