hdoj 1301 Jungle Roads
2015-08-13 17:02
281 查看
Jungle Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5587 Accepted Submission(s): 4027
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
这题是最小树的小变形,把字母之间的数,看作两地之间的距离即可!
写了两种代码:
克鲁斯卡尔:
#include<stdio.h> #include<algorithm> using namespace std; #include<math.h> #include<string.h> #define inf 99999999 #define max 5050 #define ac 150 int dot; int set[ac]; struct line { int start; int end; int dist; } num[max]; bool cmp(line a,line b)//花费从小到大排序 { { return a.dist <b.dist ; } int find(int p)//查找 { int t; int child=p; while(p!=set[p]) p=set[p]; while(child!=p) { t=set[child]; set[child]=p; child=t; } return p; } void merge(int x,int y)//合并 { int fx=find(x); int fy=find(y); if(fx!=fy) set[fx]=fy; } int main() { int i,j,k,u,v,s,t; int n; char a,b,c[ac],d; while(scanf("%d",&n)!=EOF&&n) { for(i=0;i<n;i++)//将字母转化为点与点之间的距离 { c[i]='A'+i; set[i]=i; } t=0; s=n-1; int outcome=0; while(s--) { getchar(); scanf("%c %d",&a,&u); for(k=0;k<n;k++) { if(a==c[k]) { break; } } for(i=0;i<u;i++) { num[t].start=k; getchar(); scanf("%c %d",&b,&v); for(j=0;j<n;j++) { if(b==c[j]) { num[t].end =j; break; } } num[t].dist=v; t++; } } sort(num,num+t,cmp); for(i=0;i<t;i++) { if(find(num[i].start)!=find(num[i].end ))//判断是否成环 { merge(num[i].start ,num[i].end ); outcome+=num[i].dist ; } } printf("%d\n",outcome); } }prim:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #define inf 10000000 #define ac 1000 int map[ac][ac],dist[ac],v[ac]; int dot; void prim() { int i,j; int next ,mindist,outcome=0; memset(v,0,sizeof(v)); for(i=0;i<dot;i++) dist[i]=map[0][i]; v[0]=1; for(i=1;i<dot;i++) { mindist=inf; for(j=0;j<dot;j++)// 寻找距离最近的点 { if(!v[j]&&mindist>dist[j]) { mindist=dist[j]; next=j; } } outcome+=mindist; v[next]=1; for(j=0;j<dot;j++)//更新路径 { if(!v[j]&&dist[j]>map[next][j]) dist[j]=map[next][j]; } } printf("%d\n",outcome); } int main() { char a[30],r,s; int i,j,t; int b=0,c,k,v; while(scanf("%d",&dot),dot) { for(i=0;i<dot;i++)//将字母转化成点与点之间的距离 a[i]='A'+i; for(i=0;i<dot;i++) for(j=0;j<dot;j++) { if(i==j) map[i][j]=0; else map[i][j]=inf; } for(i=0;i<dot-1;i++) { getchar(); scanf("%c %d",&r,&b); for(j=0;j<dot;j++) { if(a[j]==r) { k=j; break; } } for(j=0;j<b;j++) { scanf(" %c %d",&s,&c); for(t=0;t<dot;t++) { if(a[t]==s) { v=t; break; } } map[k][v]=map[v][k]=c; } } prim(); } return 0; }
相关文章推荐
- 使用HttpClientdopost编写 客户端、服务器与数据库Demo
- keepalived+nginx安装配置
- Qt学习之路【0】:平台的搭建与配置
- 一个例子看清楚JQuery子元素选择器children()和find()的区别
- JS模块化工具requirejs教程(二):基本知识
- ZOJ 1074 最大子矩阵和
- Robotium测试没有源码的apk--需重签名apk
- 四、建立完善现代市场体系
- SQL中的取整函数FLOOR、ROUND、CEIL、TRUNC、SIGN
- 在jQuery中使用$而避免跟其它库产生冲突的方法
- 将cordova集成到Android studio的最佳方法
- Linux常用命令
- VS2010创建并使用DLL
- Robot Framework 快速入门
- 数据结构实验之栈三:后缀式求值
- 【树链剖分】【NOI 2015】【bzoj 4196】软件包管理器
- 关于在Android Studio中使用requestWindowFeather()
- kamailio4.2.6 安装和配置教程
- JS模块化工具requirejs教程(一):初识requirejs
- For嵌套输出图形