Jungle Roads

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5839    Accepted Submission(s): 4219

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<string.h>
#include<algorithm>
using namespace std;
int pre[10010];
struct node
{
int u,v,val;
}edge[10010];
int cmp(node s1,node s2)
{
return s1.val<s2.val;
}
void init()
{
for(int i=0;i<10010;i++)
pre[i]=i;
}
int find(int x)
{
if(x==pre[x])
return x;
else
return pre[x]=find(pre[x]);
}
bool join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
return true;
}
else return false;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int k=0;
init();
for(int i=0;i<n-1;i++)
{
int m;
char op[2];
scanf("%s%d",op,&m);
for(int j=0;j<m;j++)
{
char s[2];
int t;
scanf("%s%d",s,&t);
edge[k].u=op[0]-'A';
edge[k].v=s[0]-'A';
edge[k].val=t;
k++;
}
}
sort(edge,edge+k,cmp);
int sum=0;
for(int i=0;i<k;i++)
{
if(join(edge[i].u,edge[i].v))
{
sum+=edge[i].val;
}
}
printf("%d\n",sum);
}
return 0;
}

最新文章

  1. C# webBrowser控件禁用alert,confirm之类的弹窗解决方案
  2. linux上创建ftp服务器下载文件///使用AWS服务器作为代理,下载sbt相关的包
  3. 关于http请求
  4. 递归merge排序
  5. BizTalk开发系列(二十五) SQL Adapter
  6. HDU 4910 Problem about GCD 找规律+大素数判断+分解因子
  7. phpwind8.7升级9.0.1过程(四)20130207升级到20141228
  8. oracle新建数据库时怎么选择编码格式
  9. SSMS错误代码大全
  10. 关于Cococs中的CCActionEase(中)
  11. Activity关闭另一个Acitivity
  12. SQL学习之SELECT子句顺序
  13. VIM 用正则表达式
  14. Django push: Using Server-Sent Events and WebSocket with Django
  15. eclipse出现jdk版本更新导致无法启动
  16. 终于明白了 C# 中 Task.Yield 的用途
  17. 升级python2.7, 实现python2.7与python3并存
  18. NodeJs在windows上安装配置测试
  19. Python笔记(二)查找重复元素
  20. Setting the Java Class Path

热门文章

  1. springboot启动嵌入式tomcat报错找不到jar包,关键字:FileNotFoundException,derbyLocale_cs.jar,StandardJarScanner.scan
  2. kqueue演示样例
  3. iptables 防火墙 只允许某IP访问某端口、访问特定网站
  4. 相辅相成的求最单源短路径算法:(SPFA&amp; dijkstra)
  5. Codeforces 659F Polycarp and Hay 并查集
  6. java类型与Hadoop类型之间的转换
  7. 你不知道的JavaScript(七)delete操作符
  8. 1、Windows服务器 VS Linux服务器
  9. Ini配置文件操作
  10. eclipse界面更改为黑色