Cod sursa(job #1309144)

Utilizator popicaPopescu Victor popica Data 5 ianuarie 2015 13:35:58
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct graf{int n1,n2,cost;};
graf g[400101];
int c[400101],A[400101];
bool cmp(graf a, graf b){
    return (a.cost<b.cost);
}
int n,m;
void citire(){
    int i;
    freopen("kruskal.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&g[i].n1,&g[i].n2,&g[i].cost);
    for(i=1;i<=n;i++)
        c[i]=i;
}
void afisare(){

    int suma=0;
    for(int i=1;i<=n-1;i++){
        printf("%d %d %d\n",g[A[i]].n1,g[A[i]].n2,g[A[i]].cost);
        suma+=g[A[i]].cost;
    }
    printf("%d",suma);
}
int
 main(){
     freopen("kruskal.in","r",stdin);
     freopen("kruskal.out","w",stdout);

    int nrmsel,i,maxi,mini,j;
    citire();
    sort(g+1,g+m+1,cmp);
    nrmsel=0;
    for(i=1;nrmsel<n-1;i++){
        if(c[g[i].n1]!=c[g[i].n2])
            A[++nrmsel]=i;
        if(c[g[i].n1]<c[g[i].n2]){
            maxi=c[g[i].n2];
            mini=c[g[i].n1];
        }
        else{
            maxi=c[g[i].n1];
            mini=c[g[i].n2];
        }
        for(j=1;j<=n;j++)
            if(c[j]==maxi)
                c[j]=mini;
    }
    afisare();

return 0;
}