最小生成树水题。主要是输入要仔细,kruskal算法。
直接贴代码: 172K+0MS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define Max 30
#define Maxx(a,b) (a>b)?(a):(b)
#define Min(a,b) (a<b)?(a):(b)
using namespace std;
int set[Max];
struct Node{
int from,to;
int value;
}node[3*Max];
int n;
bool cmp(const struct Node p,const struct Node q){
return p.value<q.value;
}
int find(int x){
int j=x;
while(set[x]!=x)
x=set[x];
int temp;
while(j!=x){
temp=set[j];
set[j]=x;
j=temp;
}
return x;
}
int main(){
while(scanf("%d",&n),n){
for(int i=1;i<=n;i++)
set[i]=i;
char temp;
int pivot=0,num;
for(int i=1;i<n;i++){
getchar();
getchar();
getchar();
//int num=getchar()-'0';
scanf("%d",&num);
while(num--){
getchar();
temp=getchar()-'A'+1;
node[pivot].from=i;
node[pivot].to=temp;
scanf("%d",&node[pivot++].value);
}
}
sort(node,node+pivot,cmp);
int Sum=0;
for(int i=0;i<pivot;i++){
int x=find(node[i].from);
int y=find(node[i].to);
if(x!=y){
set[Maxx(x,y)]=Min(x,y);
Sum+=node[i].value;
}
}
printf("%d\n",Sum);
}
return 0;
}