Pagini recente » Cod sursa (job #1578446) | Cod sursa (job #2739672) | Cod sursa (job #2972526) | Cod sursa (job #2739586) | Cod sursa (job #315787)
Cod sursa(job #315787)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 200000
#define MMAX 400000
int n,m,cc[NMAX+1],costtotal;
struct muchie{
int x,y,c;
};
typedef muchie *pm;
muchie v[MMAX],h[NMAX+1];
struct nod{
int info;
nod *adr;
};
typedef nod *pnod;
struct lista{
pnod vf,sf;
};
lista l[NMAX+1];
int fcmp(void const *a,void const *b){
return ((pm)a)->c-((pm)b)->c;
}
void apm(){
int i=0,ms=0,min,max,k=0;
pnod nc;
while(ms<n-1){
while(cc[v[i].x]==cc[v[i].y]) i++;
h[k]=v[i],k++;
costtotal+=v[i].c;
if(v[i].x<v[i].y){
min=cc[v[i].x];
max=cc[v[i].y];
}
else{
min=cc[v[i].y];
max=cc[v[i].x];
}
nc=l[max].vf;
while(nc){
cc[nc->info]=min;
nc=nc->adr;
}
l[min].sf->adr=l[max].vf;
l[min].sf=l[max].sf;
l[max].vf=NULL;
ms++;
}
}
int main(){
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
int i;
pnod nn;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].c);
qsort(v,m,sizeof(v[0]),fcmp);
for(i=1;i<=n;i++){
cc[i]=i;
nn=new nod;
nn->info=i;
nn->adr=NULL;
l[i].vf=nn;
l[i].sf=nn;
}
apm();
printf("%d\n%d\n",costtotal,n-1);
for(i=0;i<n-1;i++)
printf("%d %d\n",h[i].x,h[i].y);
return 0;
}