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. Sqlite数据库简介

    在应用sqlite之前需要添加sqlite库,那么我们就会发现有3和3.0的区别,开始我也并不懂,后才知道: 实际上libsqlite3.dylib本身是个链接,它指向libsqlite3.0.dyl ...

  2. 封装的多功能多效果的RecyclerView

    开源界有一句很有名的话叫"不要重复发明轮子",当然,我今天的观点不是要反驳这句话,轮子理论给我们的开发带来了极大的便利,.但我想说的是,既要会用轮子,也要知道轮子怎么造,必要的时候 ...

  3. Android studio插件安装

    Android Studio安装插件的方式其实和Eclipse大同小异.废话不多说,直接上图: 区域1:你当前已经安装了的插件 区域2:在线安装 区域3:从硬盘安装,即针对你已经下载好了的插件,可通过 ...

  4. BZOJ 2150: 部落战争 最大流

    2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  5. Gaussian Discriminant Analysis

    如果在我们的分类问题中,输入特征$x$是连续型随机变量,高斯判别模型(Gaussian Discriminant Analysis,GDA)就可以派上用场了. 以二分类问题为例进行说明,模型建立如下: ...

  6. 第一个js程序

    <html><head> <title>Untitled</title> <script >function demo(){ alert ( ...

  7. Asp.Net 之 调用远程Web_Service

    一.添加web service引用 1.右键 Web 项目 → “添加服务引用”: 2.右键已有的 App_WebReferences 文件夹 → “添加服务引用”: 二.引用远程web servic ...

  8. Android View的绘制机制流程深入详解(四)

    本系列文章主要着重深入介绍Android View的绘制机制及流程,第四篇主要介绍Android自定义View及ViewGroup的实现方法和流程. 主要介绍了自绘控件.自定义组合控件.自定义继承控件 ...

  9. VirtualBox中centos网络配置

    VirtualBox图形界面下有四种网络接入方式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接 ...

  10. 利用dijkstra算法规划线路

    # dijkstra# 1.在数据库内预先存放了北京市内最新的道路节点,选用优化了得dijkstra算法进行线路规划.    当输入起点和终点后,会计算出最短的路径.同时还能选择查看路径经过的道路节点 ...