码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj-1301 Jungle Roads 【最小生成树】

时间:2015-08-13 12:13:34      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1301

       题目可长 而且还是英文  没必要一字一句的去读题  可以根据下面的输入输出和图来搞清题意

 

 题意:有n个村庄,村庄间有公路,公路保护费用太高,不得已维护某些公路,但必须保证每个村庄间畅通。问最少要维护的道路长度

 
这一题主要将表示村庄的字符转化为数字,存入表示两村庄间关系的结构体中即可。
 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,per[30];

struct node{
	int b,e,l;
};
node edge[1000];

int cmp(node x,node y)
{
	return x.l<y.l;
}

void init()
{
	for(int i = 1; i <= n; i++)
		per[i]=i;
}

int find(int x)
{
	return per[x]==x?x:per[x]=find(per[x]);	//条件运算符 
}

bool join(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		per[fx]=fy;
		return 1;
	}
	return 0;
}

int main()
{
	int i,way,dis;
	char begin,end;
	while(scanf("%d",&n),n)
	{
		int k=0;
		int sum=0;
		init();
		for(i=1;i<n;i++)
		{
			getchar();
			scanf("%c%d",&begin,&way);
			for(int j=0;j<way;j++)//注意变量 表示含义不同 不能用同一字母表示 
			{
				getchar();
				scanf("%c%d",&end,&dis);
				edge[k].b=begin-'A'+1;//将字母转化成数字  第一个字母A-'A'+1即为数字1 第二个字母B-'A'+1即为数字2 
				edge[k].e=end-'A'+1;
				edge[k].l=dis;
				k++;
			}
		}
		sort(edge,edge+k,cmp);
		for(i=0;i<k;i++)
		{
			if(join(edge[i].b,edge[i].e))
				sum+=edge[i].l;
		}
		printf("%d\n",sum);
	}
	return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdoj-1301 Jungle Roads 【最小生成树】

标签:

原文地址:http://blog.csdn.net/qq_29606781/article/details/47608915

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!