A - Jungle Roads poj1251
题意:一个村庄要有一个最短且每个村庄都要连接到的路,
思路:kruskal裸题,唯一麻烦的输入输出要注意
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
#define max 1e5
struct map
{
int a,b,cost;
}p[100000]; //存每条边
int parent[100000]; //连通分量
int num=0; //边数
bool com(map a,map b)
{
return a.cost<b.cost;
}
int find(int x)
{
while(x!=parent[x])
x=parent[x];
return x;
}
bool Union(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
{
parent[x]=y;
return true;
}
return false;
}
int main()
{
int n,x;
char a[2],b[2];
char ch;
while(scanf("%d",&n)&&(n!=0))//1<n<27
{
getchar();
memset(parent,0,sizeof(parent));
memset(p,0,sizeof(p));
for(int i=1;i<=n;i++) //n个顶点分别为自己的连通分量的根结点
{
parent[i]=i;
}
num=1;
int ans=0;
for(int i=1;i<=n-1;i++) //输入所有的边
{
scanf("%s%d",a,&x);
//scanf("%c%d",&ch,&x);
//getchar();
int u=a[0]-'A'+1;
//int u=ch-'A'+1;
int m;
for(int j=1;j<=x;j++)
{
scanf("%s%d",b,&m);
//scanf("%c%d",&ch,&m);
//getchar();
int v=b[0]-'A'+1;
//int v=ch-'A'+1;
p[num].a=u;
p[num].b=v;
p[num].cost=m;
num++;
// printf("%d,%d,%d\n",u,v,m);
}
}
// printf("%d\n",num);
sort(p+1,p+num,com);
for(int i=1;i<num;i++)
{
if(Union(p[i].a,p[i].b))
{
ans+=p[i].cost;
// printf("%da%da\n",i,p[i].cost);
}
}
printf("%d\n",ans);
}
return 0;
}