Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5455 Accepted Submission(s): 3936

9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
216 30
通过输出数据可知输出一个数n,然后有n-1行输出,在输出一个字母,一个数m代表该行有m组输出。然后计算维修这些路的最小花费,且能保证每个村子都可以想通,不需要都想了,只要沿路能到达即可。
#include<stdio.h>
#include<algorithm>
using namespace std;
int p[1000];
struct stu{
int u,v,mo;
};
stu eg[10000];
int cmp(stu a,stu b)
{
return a.mo<b.mo;
}
int find(int x)
{
if(x==p[x])
return x;
return p[x]=find(p[x]);
}
int join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fy!=fx)
{
p[fx]=fy;
return 1;
}
return 0;
}
int main()
{
int b,d,i,j,k,t,u,v;
char a,c;
while(scanf("%d",&t)&&t)
{
for(i=1;i<=t;i++)
p[i]=i;
k=0;
for(i=0;i<t-1;i++)
{
getchar();
scanf("%c %d",&a,&b);
if(b==0)
continue;
else {
u=a-'A'+1;
}
for(j=0;j<b;j++)
{
getchar();
scanf("%c %d",&c,&d);
v=c-'A'+1;
eg[k].u=u;
eg[k].v=v;
eg[k].mo=d;
k++;
}
}
int sum=0;
sort(eg,eg+k,cmp);
for(i=0;i<k;i++)
{
if(join(eg[i].u,eg[i].v))
sum+=eg[i].mo;
}
printf("%d\n",sum);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/l15738519366/article/details/47426503