HDU 1233 还是畅通工程

转载请注明出处:http://blog.csdn.net/a1dark

分析:kruskal模板算法、原理很简单、就是先把边从小到大排个序、然后并查集、并在一起就OK、

 

#include<stdio.h>

#include<algorithm>

using namespace std;

struct node{

    int s,e;

    int val;

}flag[5050];

int map[5050];

int n;

int cmp(node a,node b){

    if(a.val<b.val)

        return 1;

    else return 0;

}

void init(){

    for(int i=1;i<=n*(n-1)/2;i++)

        map[i]=i;

}

int find(int x){

    int r=x;

    while(r!=map[r])

        r=map[r];

    int b=x;

    int f;

    while(b!=r){

        f=map[b];

        map[b]=r;

        b=f;

    }

    return r;

}

int merge(int x,int y){

    int fx=find(x);

    int fy=find(y);

    if(fx!=fy){

        map[fx]=fy;

        return 1;

    }

    return 0;

}

int main(){

    while(scanf("%d",&n)!=EOF){

        if(n==0)break;

        for(int i=0;i<n*(n-1)/2;i++){

            scanf("%d%d%d",&flag[i].s,&flag[i].e,&flag[i].val);

        }

        sort(flag,flag+(n*(n-1)/2),cmp);

        int sum=0,ans=0;

        init();

        for(int i=0;i<n*(n-1)/2;i++){

            ans=merge(flag[i].s,flag[i].e);

            if(ans)

                sum+=flag[i].val;

        }

        printf("%d\n",sum);

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)