1.链接地址:

http://bailian.openjudge.cn/practice/1251/

http://poj.org/problem?id=1251

2.题目:

总时间限制:
1000ms
内存限制:
65536kB
描述


带岛屿Lagrishan的首领现在面临一个问题:几年前,一批外援资金被用于维护村落之间的道路,但日益繁茂的丛林无情的侵蚀着村民的道路,导致道路维
修开销巨大,长老会不得不放弃部分道路的维护。上图左侧图显示的是正在使用道路的简图以及每条路每个月的维修费用(单位为aacms)。现在长老会需要提
出一种方案,即需要保证村落之间都可以互相到达,又要将每个月的道路维修费用控制在最小。村子编号为从A到I。上图右侧显示的方案最小维修开销为216
aacms每月。

输入
输入包含1~100个数据集,最后一行为0.每个数据集第一行为村落数目n, 1 < n <
27,依次用字母表的前n个字母标记。接下来有n-1行,每行的第一个数据便是按字母顺序排列的村子编号(不包括最后一个村庄)。每个村庄后面的数据k代
表该村庄通往编号在其之后的村庄的道路数目,如A 2 B 12 I
25,代表A村庄有2个编号在A之后的村庄和其相连。若k大于0,k后面会依次给出这k个村庄的编号以及各自到起始村庄的道路维修费用,如A 2 B
12 I 25,代表A和B之间道路维修费用为12,
A和I之间道路维修费用为25(维修费用为不超过100的正整数).路的总数目不超过75条,每个村庄到其他村庄不会有超过15条路(包括编号在其之前和
之后的)。
输出
每个数据集有一个输出:针对解决方案每个月维修道路的小费用。
提示:蛮力算法虽能找出解决方案,但将会超出时间限制。
样例输入
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
样例输出
216
30

3.思路:

4.代码:

 #include<stdio.h>
#include<iostream>
#define MAX 30
#define MAXLOW 9999999
using namespace std;
struct
{
int lowcost;
}closedge[MAX];
int G[MAX][MAX];
/*int minimum(int size)
{
//在g[][]已经init的前提下
int i,min;
for(i=0;i<size;i++)
{
if(closedge[i].lowcost>0)
{
min=i;
break;
}
}
for(i=i;i<size;i++)
{
if(closedge[i].lowcost>0&&closedge[i].lowcost<closedge[min].lowcost)
{
min=i;
}
}
return min;
}*/
int minimum(int size)
{
int i,min,min_num=MAXLOW;
for(i=;i<size;i++)
{
if(closedge[i].lowcost!= && closedge[i].lowcost<min_num)
{
min_num=closedge[i].lowcost;
min=i;
}
}
return min;
}
int MiniSpanTree_PRIM(int G[][MAX],int k,int size)
{ int count=;
int i,j;
//初始化辅助数组
for(j=;j<size;j++)
{
if(j!=k) closedge[j].lowcost=G[k][j];
}
closedge[k].lowcost=;//初始,U={start}
//测试辅助数组是否正确
/*for(j=0;j<size;j++)
{
cout<<closedge[j].lowcost<<" ";
}
cout<<endl;*/
for(i=;i<size;i++)
{
k=minimum(size);
count+=closedge[k].lowcost;
closedge[k].lowcost=;
for(j=;j<size;j++)
{
if(G[k][j]<closedge[j].lowcost)
{
closedge[j].lowcost=G[k][j];
}
}
/*for(j=0;j<size;j++)
{
cout<<closedge[j].lowcost<<" ";
}
cout<<endl;*/
}
return count;
}
void InitGraph(int G[][MAX])
{
int i,j;
for(i=;i<MAX;i++)
{
for(j=;j<MAX;j++)
{
G[i][j]=MAXLOW;
}
}
}
int findStart(int G[][MAX],int size)
{
int i,j;
for(i=;i<size;i++)
{
for(j=;j<size;j++)
{
if(G[i][j]!=MAXLOW) return i;
}
}
}
int main()
{
int size;
int m,n,num,cost;
int i,j;
char c1,c2;
//size为村庄数
while(scanf("%d",&size)!=EOF && size)
{
//m为第几个村庄
InitGraph(G);
/*for(m=0;m<size-1;m++)
{
//num为村庄的路的数量(不完全的)
cin>>i>>num;
for(n=0;n<num;n++)
{
cin>>j>>cost;
G[i-'A'][j-'A']=G[j-'A'][i-'A']=cost;
}
}*/
for(i=;i<size-;i++)
{
cin>>c1>>n;
for(j=;j<n;j++)
{
cin>>c2>>num;
G[c1-'A'][c2-'A']=G[c2-'A'][c1-'A']=num;
}
}
//make sure input
/*for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
cout<<G[i][j]<<" ";
}
cout<<endl;
}*/
cout<<MiniSpanTree_PRIM(G,findStart(G,size),size)<<endl;
//cout<<findStart(G,size)<<size<<endl;测试找边是否正确
} return ;
}

OpenJudge/Poj 1251 丛林中的路/Jungle Roads的更多相关文章

  1. #最小生成树# #kruskal# ----- OpenJudge丛林中的路

    最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法 ...

  2. Openjudge 235 丛林中的路

    好久没练最小生成树了 253:丛林中的路 总时间限制: 1000ms 内存限制: 65536kB 描述 热 带岛屿Lagrishan的首领现在面临一个问题:几年前,一批外援资金被用于维护村落之间的道路 ...

  3. poj 1251 Jungle Roads (最小生成树)

    poj   1251  Jungle Roads  (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...

  4. POJ 1251 Jungle Roads (prim)

    D - Jungle Roads Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Su ...

  5. POJ 1251 Jungle Roads - C语言 - Kruskal算法

    Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid ...

  6. POJ 1251 && HDU 1301 Jungle Roads (最小生成树)

    Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...

  7. POJ 1251 Jungle Roads(最小生成树)

    题意  有n个村子  输入n  然后n-1行先输入村子的序号和与该村子相连的村子数t  后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离  求链接全部村子的最短路径 还是裸的最小生成树咯 ...

  8. poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题

    poj 1251  && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...

  9. POJ - 1251

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20024   Accepted: 9234 Des ...

随机推荐

  1. HDU 5477 A Sweet Journey 水题

    A Sweet Journey Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  2. mac os升级为 Yosemite 10.10 后不能创建javaproject

    出现这样的情况可能是因为mac系统升级导致JAVA的安装路径发生改变(Xcode升级后也出现模拟器位置改变的情况,不要奇怪) 之前安装的eclipse就自然找不到SDK的路径了,所以会捆绑失败 接下来 ...

  3. web运维第一篇:nginx配置文件详解笔记

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  4. iOS开发——面试笔试精华(四)

    面试笔试精华(四) 1.        Object-C有多继承吗?没有的话用什么代替?
 1>  OC是单继承,没有多继承 2>  有时可以用分类和协议来代替多继承 2.        ...

  5. careercup-C和C++ 13.8

    13.8 编写一个智能指针类.智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制.它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的 ...

  6. 文件I/O(不带缓冲)之I/O的效率

    程序清单3-3中的程序使用read和write函数复制文件.关于该程序应注意下列各点: 它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入.输出已由shell安排好.确实,所有常用的 ...

  7. excel vba 打印设置(转)

    FROM: http://hi.baidu.com/kdlipm/blog/item/0897dd16ffc03e59f3de32ab.html PageSetup 函式就會記錄時, 設定的記錄三個部 ...

  8. 【转】 使用Beaglebone Black的PRU(三)——实现高达100MHz的GPIO输出

    友情提示:请先按照本系列(一)(二)的说明安装PRU工具并跑通hello world再继续按本文操作. PRU操作GPIO有很多种方式,本系列之(二)中的是一种,但最快速的方式是通过直接“写”r30和 ...

  9. Hibernate初级

    文章来源: http://blog.csdn.net/jiuqiyuliang/article/details/39078749/ 持久化(Persistence),把数据(如内存中的对象)保存到可永 ...

  10. ios通知-kvo

    // KVC: Key Value Coding, 常见作用:给模型属性赋值    // KVO: Key Value Observing, 常用作用:监听模型属性值的改变 // // ViewCon ...