这个题目,让我最费解的是,我在接受ABC的时候必须用char[],而不能用char,否则会出现读不到的情况。很迷。
代码简单:
#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 110
#define repf(i,from,to) for(int i =from ; i<to ; i++)
#define ll long long
int pre[MAX];
struct Node{
int a ,b,l ;
}nodes[MAX*MAX/2];
int M ,N ;
bool cmp(Node a ,Node b)
{
return a.l<b.l;
}
int Find(int x)
{
if(x!=pre[x])
{
pre[x]=Find(pre[x]);
}
return pre[x];
}
int main(){
while(~scanf("%d",&N)&&N)
{
int res = 0 ;
char from[5] ,to[5];//太TM神奇了,这个地方如果只是个char,不是数组。那么就直接gg'了,一开始的数据死活读不到
int num ;
for(int i = 1; i <=N;i++)
{
pre[i]=i;
}
int index = 0 ,dis;
while(N>1)
{
scanf("%s %d",&from,&num);
while(num--)
{
scanf("%s %d",&to,&dis);
int ifrom = (from[0]-'A')+1;
int ito = (to[0]-'A')+1;
nodes[index].a = ifrom;
nodes[index].b = ito;
nodes[index++].l = dis;
}
N--;
}
sort(nodes,nodes+index,cmp);
repf(i,0,index)
{
int fa = Find(nodes[i].a);
int fb = Find(nodes[i].b);
if(fa!=fb)
{
pre[fa]=fb;
res += nodes[i].l;
}
}
printf("%d\n",res);
}
return 0 ;
}