http://poj.org/problem?id=1251
scanf会爆栈,不知为啥
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=30+10;
int fa[maxn];
int Find1(int x){return x==fa[x]?x:fa[x]=Find1(fa[x]);}
int n,m;
struct Edge{
int u,v,w;
bool operator<(const Edge& rhs)const{
return w<rhs.w;
}
}e[80];
int kurkal(){
int ans=0;
for(int i=0;i<n;i++)fa[i]=i;
sort(e,e+m);
//for(i=0;i<m;i++)printf("%d->%d %d\n",e[i].u,e[i].v,e[i].w);
for(int i=0;i<m;i++){
int u=Find1(e[i].u);
int v=Find1(e[i].v);
if(u!=v){
fa[u]=v;
ans+=e[i].w;
}
}
return ans;
}
int main(){
while(scanf("%d",&n)==1&&n){
char ch,s;
int cnt=0;
m=0;
for(int i=1;i<n;i++){
cin>>ch>>cnt;
s=ch;
for(int j=0;j<cnt;j++){
int w;
cin>>ch>>w;
e[m].u=s-'A';
e[m].v=ch-'A';
e[m++].w=w;
}
}
int ans=kurkal();
printf("%d\n",ans);
}
return 0;
}