hdu1301kruscal

来源:互联网 发布:淘宝卖家常用插件 编辑:程序博客网 时间:2024/05/13 10:23
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int pa[900],rank1[900];
int ans;
typedef struct{
    int u,v,c;
}edge;
edge e[900];
bool cmp(const edge& e1,const edge& e2){
     return e1.c<e2.c;
}
void make(int x){
    pa[x]=x;
    rank1[x]=0;
}
int findd(int x){
    if(x!=pa[x])
        pa[x]=findd(pa[x]);
    return pa[x];
}
void unite(int x,int y,int w){
    x=findd(x);
    y=findd(y);
    if(x==y)
        return ;
    ans+=w;
    if(rank1[x]<rank1[y])
        pa[x]=y;
    else{
        pa[y]=x;
        if(rank1[x]==rank1[y])
            rank1[x]++;
    }
}
int main(){
    int n;
    char a,b;
    int m;
    int k=0;
    while(scanf("%d",&n)&&n){
        ans=0;
        k=0;
        for(int i=1;i<=(n-1);i++){
            getchar();
            scanf("%c",&a);
            //getchar();
            scanf("%d",&m);
            for(int j=0;j<m;j++){
                getchar();
                scanf("%c",&b);
                e[k].u=i;
                e[k].v=b-'A'+1;
                scanf("%d",&e[k++].c);
            }
        }
        for(int i=1;i<=n;i++){
            make(i);
        }
        sort(e,e+k,cmp);
        for(int i=0;i<k;i++){
            int x=findd(e[i].u);
            int y=findd(e[i].v);
            if(x!=y)
                unite(x,y,e[i].c);
        }printf("%d\n",ans);
    }
    return 0;
}
0 0
原创粉丝点击