(hdu step 6.1.6)Jungle Roads(在索引为字符索引的情况下,求让n个点连通的最小费用)

题目:

Jungle Roads

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

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

 

Source

Mid-Central USA 2002


Recommend

Eddy

题目分析:

使用kruscal求最小生成树。这道题需要注意以下几点:

1)这道题给出的是字符索引,我们需要将字符索引转数字索引。如:edges[cnt].begin = start - ‘A‘ + 1;

2)另外,这道题的输入数据的格式也需要注意一下。

A 2 B 12 I 25
B 3 C 10 H 40 I 8

这组输入样例的意思是:

A与2个点相连,与点B相连的边AB的权值为12,与点I相连的权值是25

代码如下:

/*
 * f.cpp
 *
 *  Created on: 2015年3月10日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 28;

struct Edge{
	int begin;
	int end;
	int weight;
}edges[maxn*maxn];

int father[maxn];

int find(int a){
	if(a == father[a]){
		return a;
	}

	return father[a] = find(father[a]);
}

int kruscal(int count){
	int i;
	for(i = 1 ; i < maxn ; ++i){
		father[i] = i;
	}

	int sum = 0;

	for(i = 1 ; i <= count ; ++i){
		int fa = find(edges[i].begin);
		int fb = find(edges[i].end);

		if(fa != fb){
			father[fa] = fb;
			sum += edges[i].weight;
		}
	}

	return sum;
}

bool cmp(Edge a,Edge b){
	return a.weight < b.weight;
}

int main(){
	int n;
	while(scanf("%d",&n)!=EOF,n){
		int i;
		int cnt = 1;
		for(i = 1 ; i < n ; ++i){
			char start;
			int roads;

			cin >> start >> roads;

			int j;
			for(j = 1 ; j <= roads ; ++j){
				char end;
				int weight;

				cin >> end >> weight;

				//将字符索引转化成数字索引..
				edges[cnt].begin = start - ‘A‘ + 1;
				edges[cnt].end = end - ‘A‘ + 1;
				edges[cnt++].weight = weight;
			}
		}

		cnt -= 1;
		sort(edges+1,edges+1+cnt,cmp);

		printf("%d\n",kruscal(cnt));
	}

	return 0;
}
时间: 2024-10-17 05:33:50

(hdu step 6.1.6)Jungle Roads(在索引为字符索引的情况下,求让n个点连通的最小费用)的相关文章

(hdu step 6.1.2)Eddy&#39;s picture(在只给出二维坐标点的情况下,求让n个点连通的最小费用)

题目: Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 172 Accepted Submission(s): 126   Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to be

(hdu step 6.1.7)Connect the Cities(在有的路已经修建好的情况下,求让n个点连通的最小费用)

题目: Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 391 Accepted Submission(s): 139   Problem Description In 2100, since the sea level rise, most of the cities disappear. Though

(hdu step 3.2.4)FatMouse&#39;s Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1034 Accepted Submission(s): 526   Proble

(hdu step 3.2.6)Monkey and Banana(在第一关键字有序的情况下,根据第二关键字求最长上升子序列的高度之和)

题目: Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 720 Accepted Submission(s): 455   Problem Description A group of researchers are designing an experiment to test the IQ of a m

(heu step 6.1.1)Constructing Roads(最小生成树模板题:求让n个点连通的最小费用)

题目: Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 207 Accepted Submission(s): 135   Problem Description There are N villages, which are numbered from 1 to N, and you should bu

(hdu step 5.1.6)Virtual Friends(在结点为名字结点的条件下,求并查集的节点数)

题目: Virtual Friends Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 329 Accepted Submission(s): 98   Problem Description These days, you can do all sorts of things online. For example, you can use

(hdu step 6.1.5)继续畅通工程(求让n个点连通的最小费用)

题目: 继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 173 Accepted Submission(s): 132   Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任

(hdu step 1.3.1)FatMouse&#39; Trade(在收入需要一定的付出的情况下求最大收入)

题目: FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5092 Accepted Submission(s): 1530   Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats gua

(hdu step 5.1.4)Farm Irrigation(在两个节点合并有限制条件的情况下,求集合的个数)

题目: Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 202 Accepted Submission(s): 104   Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle,