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

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行,每一行第一的字母代表景点,后面的数字代表与它相连的景点数,后面有n对字母与数字,代表与该景点相连的景点及距离。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100
int ptr[N];//父亲数组
int num,n;
struct vallage
{
int start,to,weight;
};
struct vallage v[N];
void init()
{
int i;
for (i=0;i<N;i++)
{
ptr[i]=i;
}
}
bool cmp(vallage a,vallage b)
{
if (a.weight<b.weight)
{
return true;
}
return false;
}
int find(int x)
{
return ptr[x]==x?x:ptr[x]=find(ptr[x]);
}
void solve()
{
int x,y,i,intree=0,ans=0;
sort(v,v+num,cmp);
// for (i=0;i<num;i++)
// {
// printf("%d %d %d\n",v[i].start,v[i].to,v[i].weight);
// }
for (i=0;i<num;i++)
{
x=find(v[i].start);//找父亲
y=find(v[i].to);
if (x!=y)
{
ans=ans+v[i].weight;
ptr[x]=y;
intree++;
if (intree==n-1)//以加入最小数边数
{
break;
}
}
}
printf("%d\n",ans);
}
int main()
{
int i,net,j,weight;//net为邻接边数,weight为权
char start,to;//start为出点,to出点
while (scanf("%d",&n)&&n)
{
if (n==0)
{
return 0;
}
num=0;
init();
for (i=0;i<n-1;i++)
{
cin>>start>>net;
for (j=0;j<net;j++)
{
cin>>to>>weight;
v[num].start=start-‘A‘;
v[num].to=to-‘A‘;
v[num++].weight=weight;
}
}
solve();
}
return 0;
}
原文:https://www.cnblogs.com/hemeiwolong/p/8994259.html