【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

HDU1301 普里姆最小生成树

原创 2016年05月31日 01:02:58

Jungle Roads

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


Problem Description

The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems.

The input consists of one to 100 data sets, followed by a final line containing only 0. Each data set starts with a line containing only a number n, which is the number of villages, 1 < n < 27, and the villages are labeled with the first n letters of the alphabet, capitalized. Each data set is completed with n-1 lines that start with village labels in alphabetical order. There is no line for the last village. Each line for a village starts with the village label followed by a number, k, of roads from this village to villages with labels later in the alphabet. If k is greater than 0, the line continues with data for each of the k roads. The data for each road is the village label for the other end of the road followed by the monthly maintenance cost in aacms for the road. Maintenance costs will be positive integers less than 100. All data fields in the row are separated by single blanks. The road network will always allow travel between all the villages. The network will never have more than 75 roads. No village will have more than 15 roads going to other villages (before or after in the alphabet). In the sample input below, the first data set goes with the map above.

The output is one integer per line for each data set: the minimum cost in aacms per month to maintain a road system that connect all the villages. Caution: A brute force solution that examines every possible set of roads will not finish within the one minute time limit.
 

Sample Input
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
 

Sample Output
216
30
很简单的最小生成树,注意下边界处理就可以了,我的这个就没注意卡在了F 0这种数据上
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define INF 0x3f3f3f
int main()
{
	int n,m,i,j,k;
	int temp1,temp2;
	char s1[30],s2[30];
	int e[30][30],dis[30],book[30];
	while (scanf("%d",&n)!=EOF&&n)
	{
		for (i = 1; i <= n; i++)
		{
			book[i] = 0;
			for (j = 1; j <= n; j++)
			{
				e[i][j] = INF;
			}
		}
		for (i = 1; i < n; i++)
		{
			scanf("%c%d", &s1[i], &temp1);
			for (j = 1; j <= temp1; j++)
			{
				scanf("%c%d", &s2[j], &temp2);
				e[i][j] = e[j][i] = temp2;
			}
		}
		for (i = 2; i <= n; i++)
		{
			dis[i] = e[1][i];
		}
		book[1] = 1;
		int count = 1;
		int sum = 0 , min;
		while (count < n)
		{
			min = INF;
			for (i = 1; i <= n; i++)
			{
				if (book[i] == 0 && dis[i] < min)
				{
					min = dis[i];
					j = i;
				}
			}
			book[j] = 1;
			count++;
			sum += sum;

			for (k = 1; k <= n; k++)
			{
				if (book[k] == 0 && dis[k] > e[j][k])
				{
					dis[k] = e[j][k];
				}
			}
		}
		printf("%d\n", sum);
	}
	return 0;
}


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

相关文章推荐

hdu1301 Jungle Roads

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...

HDU1301

HDU1301本题为一道简单的图论的prim算法,虽然本题思路明确但是,本题的前期数据的处理为一大难题;本人也在此WA了2次本来以为是自己写的算法的错误,后来发现对其数据处理存在着错误。代码如下: ...

HDU1301 并查集和最小生成树

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...

HDU1301 Jungle Roads 【最小生成树Prim】

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T...

hdu1301——Jungle Roads——最小生成树

简单地最小生成树,一A The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid...

数据结构中图结构的最小生成树算法(普里姆算法)

数据结构中图结构的最小生成树算法(普里姆算法) 最近有很久都没有露头了,主要是有很多的作业,而且马上就到了期末考试了,所以我没有什么时间来这里发布文章了。今天呢,把我以前写的图结构再次搬了上来。这次的...

普里姆算法—最小生成树

#include&lt;stdio.h&gt;// 用prim算法构造五项连通图网的最小生成树 #define maxcost 1000 int gm[50][50]; void prim(int tree[],int cost[],int n) {//从序号为0的顶点出发,建立连通网的最小生成树,二维数组gm[][]是其邻接矩阵 //顶点编号依次为0......n-1,建立的最小生成树存于数组tree中,对应的边值在cost中 int flag[50]={0};//标记数组,用于记录点是否加入到U中 in

算法:图的普里姆算法最小生成树-数据结构(22)

一、由图生成最小生成树 最小生成树的结点为n,则弧为n-1。算法便是,删去一些边使得图成为一棵树,且这棵树要成为权重最小的树。那要删去那些边呢?这便是普里姆算法了。参考算法P173-P176,思路是...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)