HDUOJ----1301 Jungle Roads
Jungle Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3968 Accepted Submission(s): 2888
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
最小生成树 ,解法一 普利姆算法...
做了这么多不妨做一个总结ba 。 关于普利姆算法
普利姆一般用于连续的点...(密集型的结构图)。
通过这个p大家可能会看的比较明白....
比如 第二个样列
3
A 2 B 10 C 40
B 1 C 20 a-->(b-->c ,c) 对于这样一个图,随机从一点出发... 米前景一步变求一次最小,,,
于是 觉得用代码更有说服力。。。毕竟要说明白也很花时间,.
代码:
1 // test 1 prim
2 //< @ Gxjun coder>
3 #include<stdio.h>
4 #include<string.h>
5 const int inf=0x3f3f3f3f ;
6 int vis[27],lowc[27];
7 int prim( const int cost[][27], int n)
8 {
9 int i,j,p;
10 memset(vis,0,sizeof(vis));
11 vis[0]=1;
12 int minc,res=0;
13 for(i=1; i<n ;i++)
14 lowc[i]=cost[0][i];
15 for(i=1;i<n;i++)
16 {
17 minc=inf;
18 p=-1;
19 for( j=0; j<n; j++)
20 {
21 if(0==vis[j] && minc>lowc[j])
22 {
23 minc = lowc[j];
24 p=j;
25 }
26 }
27 if(minc==inf) return -1;
28 res+=minc;
29 vis[p]=1;
30 for(j=0 ; j<n ;j++)
31 {
32 if(vis[j]==0 && lowc[j]>cost[p][j])
33 lowc[j]=cost[p][j];
34 }
35
36
37 }
38 return res;
39 }
40 int sta[27][27];
41 int main()
42 {
43 int n,m,i,j;
44 char a[2],b[2];
45 int val;
46 while(scanf("%d",&n),n)
47 {
48 for(i=0 ;i<26; i++)
49 {
50 for( j=0; j<26 ;j++)
51 {
52 sta[i][j]=inf;
53 }
54 }
55 for(i=1; i<n; i++)
56 {
57
58 scanf("%s %d",a,&m);
59 int fo=a[0]-'A';
60 while(m--)
61 {
62 scanf("%s %d",b, &val);
63 int tot=b[0]-'A';
64 sta[fo][tot]=sta[tot][fo]=val;
65 }
66 }
67
68 printf("%dn",prim(sta,n));
69 }
70 return 0;
71 }
方法二: 克鲁斯卡尔算法(krusal)
运用并查集进行联通分量的查找,逐步口大连通分量.....
详细代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Side
{
int vs,ve; //<vs--->表示开始的位置,ve-->代表结束的位置>
int len ; // <边的长度>
}side;
side sta[100]; //最多50个节点
//<用到并查集来A>
int father[27];
/*初始化*/
void mset()
{
for(int i=0; i<26 ;i++)
father[i]=i;
}
//<查找>
int setfind(int x)
{
if(x!=father[x])
father[x]=setfind(father[x]);
return father[x];
}
// <合并>即克鲁斯卡尔算法
void krusal( int sx ,int sy)
{
int x=setfind(sx);
int y=setfind(sy);
if(x==y) return ;
if(x<y)
father[y]=x;
else
father[x]=y;
}
int cmp(const void* a ,const void* b )
{
return (*(side *)a).len-(*(side*)b).len;
}
int main( void )
{
int n,m,tol,val,i,ans;
char a[2],b[2];
while(scanf("%d",&n),n)
{
ans=tol=0;
for(i=1; i<n ;i++)
{
scanf("%s%d",a,&m);
while(m--)
{
scanf("%s%d",b, &val);
sta[tol].vs=a[0]-65;
sta[tol].ve=b[0]-65;
sta[tol].len=val;
tol++;
}
}
mset();
qsort(sta,tol ,sizeof(sta[0]),cmp);
for(i=0 ; i<tol ;i++)
{
int tem1=setfind(sta[i].vs);
int tem2=setfind( sta[i].ve ) ;
if(tem1 != tem2) //如果两个两桶分量不在一起,那就链接起来
{
krusal(tem1,tem2);
ans+=sta[i].len;
}
}
printf("%dn",ans);
}
return 0;
}
- Sedo榜单中,域名“加密世界”CryptoWorld.com七位数夺冠
- ExtJs学习笔记(20)-利用ExtJs的Ajax与服务端WCF交互
- 2018年热点分享:比特币到底是什么?
- JVM快速入门
- SQL学习之使用常用函数处理数据
- Javascript快速入门(上篇)
- SQL练习之不反复执行相同的计算
- SQL练习之求解填字游戏
- 快速入门系列--WCF--08扩展与新特性
- SQL练习之两个列值的交换
- Parcel,零配置开发 React 应用!
- 像 React Native 开发 APP 一样,用wn-cli 开发 weapp (微信小程序)
- 正则表达式快速入门
- JavaScript之<script>标签简介
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android Studio编写AIDL文件后如何实现自动编译生成
- Android 实现永久性开启adb 的root权限
- 使用Android Studio实现为系统级的app签名
- Android开发实现控件双击事件的监听接口封装类
- Android普通应用升级为系统应用并获取系统权限的操作
- 使用kotlin协程提高app性能(译)
- Android中实现ping功能的多种方法详解
- Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例
- 在Android源码中编译出指定jar包的操作
- Android Studio 视频播放失败 start called in state1 异常怎么解决
- 解决Android 源码编译错误的问题
- Android 实现列表倒计时功能
- Android 多渠道(友盟)打包教程分享
- Android Broadcast 和 BroadcastReceiver的权限限制方式
- [GO] 变参函数-GO中函数传递变长参数