最小生成树Jungle Roads
这道题一定要注意录入方式,我用的解法是prime算法
因为单个字符的录入会涉及到缓冲区遗留的空格问题,我原本是采用c语言的输入方法录入数据的,结果对了,但是提交却一直wrong,后来改成了c++的cin方法来录入,就对了
先把提交对的代码和提交错的代码都放上来,欢迎提出建议
prime算法:
1:清空生成树,任取一个顶点加入生成树
2:在那些一个顶点在生成树中,一个顶点不在生成树的边中,选取一条权最小的边,将他和另一个端点加入生成树
3:重复步骤2,直到所有的点都进入了生成树为止,此时的生成树就是最小生成树。
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.
Input
Output
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 <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 30
#define inf 1000000000
typedef int elem_t;
/*
题意:
多组案例
每组案例第一行输入一个数字n
下面n-1行
每行的第一个数据都是一个字符start,字符从A往后依次排列
每行的第二个数据是一个数字num,表示有num个节点与该行第一个字符表示的节点相连
每行接下来的数据是num组end,cost,表示start到end的花费为cost
具体输入输出看案例就会懂
解法:prime算法
*/
elem_t prim(int n, elem_t mat[][MAXN], int* pre)
{
elem_t min[MAXN], ret = ;
int v[MAXN], i, j, k;
for(i = ; i < n; i++)
min[i] = inf, v[i] = , pre[i] = -;
for(min[j = ] = ; j < n; j++)
{
for(k = -, i = ; i < n; i++)
if(!v[i] && (k == - || min[i] < min[k]))
k = i;
for(v[k] = , ret += min[k], i = ; i < n; i++)
if(!v[i] && mat[k][i] < min[i])
min[i] = mat[pre[i] = k][i];
}
return ret;
}
int main()
{
int n;
elem_t mat[MAXN][MAXN];
int pre[MAXN];
//freopen("input.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
if(n == )
break;
for(int i = ; i < n; i++)
for(int j = ; j <= i; j++)
mat[i][j] = mat[j][i] = inf;
char s, e;
int num, cost;
for(int i = ; i < n-; i++)
{
cin >> s >> num;
for(int j = ; j < num; j++)
{
cin >> e >> cost;
mat[s-'A'][e-'A'] = mat[e-'A'][s-'A'] = cost;
}
}
elem_t mi = prim(n, mat, pre);
printf("%d\n", mi);
}
return ;
}
下面是没过的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAXN 30
#define inf 1000000000
typedef int elem_t;
elem_t prim(int n, elem_t mat[][MAXN], int* pre)
{
elem_t min[MAXN], ret = ;
int v[MAXN], i, j, k;
for(i = ; i < n; i++)
min[i] = inf, v[i] = , pre[i] = -;
for(min[j = ] = ; j < n; j++)
{
for(k = -, i = ; i < n; i++)
if(!v[i] && (k == - || min[i] < min[k]))
k = i;
for(v[k] = , ret += min[k], i = ; i < n; i++)
if(!v[i] && mat[k][i] < min[i])
min[i] = mat[pre[i] = k][i];
}
return ret;
}
int main()
{
int n;
elem_t mat[MAXN][MAXN];
int pre[MAXN];
freopen("input.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
if(n == )
break;
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
mat[i][j] = inf;
}
for(int i = ; i < n-; i++)
{
char ch1, ch2;
getchar();
scanf("%c", &ch1);
int num;
elem_t cost;
scanf("%d", &num);
for(int j = ; j < num; j++)
{
scanf(" %c%d", &ch2, &cost);
if(cost < mat[ch1-'A'][ch2-'A'])
mat[ch1-'A'][ch2-'A'] = mat[ch2-'A'][ch1-'A'] = cost;
}
}
elem_t mi = prim(n, mat, pre);
printf("%d\n", mi);
}
return ;
}
最小生成树Jungle Roads的更多相关文章
- (最小生成树) Jungle Roads -- POJ -- 1251
链接: http://poj.org/problem?id=1251 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2177 ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- POJ 1251 && HDU 1301 Jungle Roads (最小生成树)
Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...
- POJ 1251 Jungle Roads(最小生成树)
题意 有n个村子 输入n 然后n-1行先输入村子的序号和与该村子相连的村子数t 后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离 求链接全部村子的最短路径 还是裸的最小生成树咯 ...
- POJ1251 Jungle Roads 【最小生成树Prim】
Jungle Roads Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19536 Accepted: 8970 Des ...
- HDU-1301 Jungle Roads(最小生成树[Prim])
Jungle Roads Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total ...
- Jungle Roads(最小生成树)
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- (最小生成树)Jungle Roads -- HDU --1301
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1301 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDUOJ----1301 Jungle Roads
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
随机推荐
- [Script]EBS里查看模块的版本、文件的版本信息【Z】
系统版本信息 装了哪些模块,以及版本信息 select 'Current Application Release: '||ver||' ('||bug||')' "Description&q ...
- 开发环境配置--Ubuntu+Qt4+OpenCV(二)
同系列文章 1. 开发环境配置--Ubuntu+Qt4+OpenCV(一) 2. 开发环境配置--Ubuntu+Qt4+OpenCV(二) 3. 开发环境配置--Ubuntu+Qt4+OpenCV(三 ...
- C/C++ 结构体成员在内存中的对齐规则(转载)
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...
- JVM学习之对象的状态
堆中存放着几乎所有的对象实例,垃圾收集器在堆堆进行回收前,首先要确定这些对象哪些还“活着”,哪些已经“死去”.方法有如下两种: (1)引用计数法 算法思想:为对象添加一个引用计数器,每当有一个地方引用 ...
- Git 系列(五):三个 Git 图形化工具
在本文里,我们来了解几个能帮你在日常工作中舒服地用上 Git 的工具. 我是在这许多漂亮界面出来之前学习的 Git,而且我的日常工作经常是基于字符界面的,所以 Git 本身自带的大部分功能已经足够我用 ...
- centos安装中文支持(转)
安装中文支持包. yum install fonts-chineseyum install fonts-ISO8859-2 -------- 一.安装中文支持方法1.在安装光盘中找到一下包进行安装.r ...
- Thinkphp的页面判断
目前在做的系统中,涉及到了前端页面的判断,比如性别在数据库中存储为0或1,而页面显示应该为“男”或“女”,这里就需要用到页面判断. 比如, <volist name="st" ...
- VHDL设计时参数定义的方法 例子
-- SPtb LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_ ...
- Python核心编程笔记---- input 与raw_input
1.raw_input:的返回值是一个string 对象. 2.input:相当于eval(raw_input()),计算出来是什么类型就是什么类型. ------------------------ ...
- Protection 5 ---- Priviliege Level Checking 2
CPU不仅仅在程序访问数据段和堆栈段的时候进行权限级别检查,当程序控制权转换的时候也会进行权限级别检查.程序控制权转换的情况很多,各种情况下检查的方式以及涉及到的检查项都是不同的.这篇文章主要描述了各 ...