HDU 1301  Jungle Roads

来源:互联网 发布:vscode自动补全快捷键 编辑:程序博客网 时间:2024/04/27 14:47
Jungle Roads

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


Problem Description
HDU <wbr>1301 <wbr> <wbr>Jungle <wbr>Roads

The Head Elder of the tropical island of Lagrishan has aproblem. A burst of foreign aid money was spent on extra roadsbetween villages some years ago. But the jungle overtakes roadsrelentlessly, so the large road network is too expensive tomaintain. The Council of Elders must choose to stop maintainingsome roads. The map above on the left shows all the roads in usenow and the cost in aacms per month to maintain them. Of coursethere needs to be some way to get between all the villages onmaintained roads, even if the route is not as short as before. TheChief Elder would like to tell the Council of Elders what would bethe smallest amount they could spend in aacms per month to maintainroads that would connect all the villages. The villages are labeledA through I in the maps above. The map on the right shows the roadsthat could be maintained most cheaply, for 216 aacms per month.Your task is to write a program that will solve suchproblems. 

The input consists of one to 100 data sets, followed by afinal line containing only 0. Each data set starts with a linecontaining only a number n, which is the number of villages, 1< n < 27, and the villages arelabeled with the first n letters of the alphabet, capitalized. Eachdata set is completed with n-1 lines that start with village labelsin alphabetical order. There is no line for the last village. Eachline for a village starts with the village label followed by anumber, k, of roads from this village to villages with labels laterin the alphabet. If k is greater than 0, the line continues withdata for each of the k roads. The data for each road is the villagelabel for the other end of the road followed by the monthlymaintenance cost in aacms for the road. Maintenance costs will bepositive integers less than 100. All data fields in the row areseparated by single blanks. The road network will always allowtravel between all the villages. The network will never have morethan 75 roads. No village will have more than 15 roads going toother villages (before or after in the alphabet). In the sampleinput below, the first data set goes with the mapabove. 

The output is one integer per line for each data set: theminimum cost in aacms per month to maintain a road system thatconnect all the villages. Caution: A brute force solution thatexamines every possible set of roads will not finish within the oneminute 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
最小生成树,1A
代码:
#include<stdio.h>
#include<stdlib.h>
struct point{
int begin,end;
int len;
}map[900];
int flag[30];
int cmp(const void *a,const void *b)
{
struct point *c,*d;
c=(struct point *)a;
d=(struct point *)b;
return c->len-d->len;
}
int father(int x)
{
if(flag[x]==x)
return x;
flag[x]=father(flag[x]);
return flag[x];
}
int main()
{
int N,i,j,k,b,sum,fa,fb,num;
char s,a;
while(scanf("%d",&N),N)
{
k=0;
getchar();
for(i=1;i<=N-1;i++)
{
scanf("%c %d",&s,&num);
for(j=1;j<=num;j++)
{
scanf(" %c %d",&a,&b);
map[k].begin=s-'A';
map[k].end=a-'A';
map[k++].len=b;
}
getchar();
}
for(i=0;i<=N;i++)
flag[i]=i;
qsort(map,k,sizeof(map[0]),cmp);
sum=0;
for(i=0;i<k;i++)
{
fa=father(map[i].begin);
fb=father(map[i].end);
if(fa!=fb){
sum+=map[i].len;
if(fa>fb)
flag[fa]=fb;
else flag[fb]=fa;
}
}
printf("%d\n",sum);
}
return 0;
}

原创粉丝点击