【wikioi】1003 电话连线
算法: 最小生成树
PS:被卡过2天(中间的时间没去做)。日期:2013-09-13 13:49:47 ~ 2013-09-17 13:01:07
此题为基础题
刚开始学图论时只会用Kruskal+并查集,以为Kruskal和Prim差不多= =于是就用Kruskal来做这题,结果是不用说的
然后就学习了Prim,并在我之前的博文有介绍 最小生成树
题目描述:
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
需要注意的是,输入中可能已经包含了电话线,所以要判断此电话线是否存在(输入中0表示有,故判断是否为true即可),存在就不予考虑。不会影响到算法。
CODE:
//最小生成树 Prim算法
//我没用到优先队列,是直接用暴力找出的= =
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 105;
const int INF = 2147483647;
int i, j, n;
long long ans = 0;
int edge[MAXN][MAXN], key[MAXN], p[MAXN], vis[MAXN] = {0}, //edge表示存的边 key表示权值,p表示父亲,vis表示是否已经存在已生成的树中
f[MAXN], l[MAXN], m = 0; //f表示头,右边表示尾
int main()
{
cin >> n;
for(i = 1; i <= n; i++)for(j = 1; j <= n; j++) cin >> edge[i][j];
for(i = 1; i <= n; i++) key[i] = INF;
key[1] = 0; //
p[1] = 1;
int Mini, Min;
for(i = 0; i < n; i++) //之需要加最多n条边,故循环n次
{
Min = INF;
for(j = 1; j <= n; j++) if(!vis[j] && key[j] < Min){Mini = j; Min = key[j];} //找key值最小的点,即与树相邻的节点的最小权值边
vis[Mini] = 1; //设置访问过,即生成树已连接Mini这个节点
ans += key[Mini];
if(key[Mini])
{
f[m] = min(p[Mini], Mini); //字典序的边
l[m++] = max(p[Mini], Mini); //同上
}
for(j = 1; j <= n; j++) //伪松弛,更新树临边节点的key值并维护p域
if(!vis[j] && edge[Mini][j] < key[j])
{key[j] = edge[Mini][j]; p[j] = Mini;}
}
cout << m << endl;
for(i = 0; i < m; i++) cout << f[i] << ' ' << l[i] << endl;
cout << ans;
return 0;
}
【wikioi】1003 电话连线的更多相关文章
- Codevs 1003 电话连线
时间限制: 1 s 空间限制: 128000 K 题目等级 : 黄金 Gold 题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当 ...
- codevs——1003——电话连线
题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...
- 1、Codevs 必做:2833、1002、1003、2627、2599
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- 电话连线(codevs 1003)
题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...
- Bestcoder#5 1003
Bestcoder#5 1003 Poor RukawTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- dp 动态规划 hdu 1003 1087
动态规划就是寻找最优解的过程 最重要的是找到关系式 hdu 1003 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意:求最大字序列和, ...
- PKU 1003解题
首先庆祝一下,今天连A了3题.感觉后面这题太简单了.. 由于英文不好 ,找了个翻译: 若将一叠卡片放在一张桌子的边缘,你能放多远?如果你有一张卡片,你最远能达到卡片长度的一半.(我们假定卡片都正放在桌 ...
- POJ做题笔记:1000,1004,1003
1000 A+B Problem 题目大意:输入两个数a和b,输出他们的和. 代码: #include <stdio.h> int main() { int a, b; while (sc ...
随机推荐
- Sql Server 索引之唯一索引和筛选索引
唯一索引(UNIQUE INDEX) 当主键创建时如果不设置为聚集索引,那么就一定是唯一的非聚集索引.实际上,唯一索引,故名思议就是它要求该列上的值是唯一的.唯一索引能够保证索引键中不包含重复的值, ...
- BI 项目管理之生命周期跟踪和任务区域
DW/BI 系统是复杂的实体,构建这种系统的方法必须有助于简化复杂性.13 个方框显示了构建成功的数据仓库的主要任务区域,以及这些任务之间的主要依赖关系. 在生命周期这一级可以进行多方观察 ...
- c程序辨别系统是64位 or 32位
#include <stdio.h> int main(void) { int i = 0x80000000; ){ printf("i = %d\n", i); pr ...
- jqueryEasyUI:tabs扩展:给tabs组件绑定双击事件 分类: JqueryEasyUI 2014-09-29 14:36 537人阅读 评论(0) 收藏
实现代码: $.extend($.fn.tabs.methods, { /** * 绑定双击事件 * @param {Object} jq * @param {Object} caller 绑定的事件 ...
- js 随机星星 document.createElement(); setAttribute()
js 随机星星 document.createElement(); setAttribute() <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- Android JNI开发生成.h头文件问题(转)
在JNI开发中,首先要将建立的anroid类编译成.h文件,编译用到命令javah,由于第一次用,以前对java的编译过程也不怎么了解,所以走了好多弯路,网络没有对这一步的详细介绍,这里讲一下: 通过 ...
- 设定自动获得DNS服务器地址
情况说明:操作系统是Win7 64位, 网络是有线 1 2 3 4 5
- Build better apps: Windows 10 by 10 development series
http://blogs.windows.com/buildingapps/2015/08/05/build-better-apps-windows-10-by-10-development-seri ...
- hdu 3001(状压dp, 3进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 由于本题中一个点最多能够访问2次,由此可以联想到3进制; visited[i][j]表示在状态i ...
- objective-c 遍历文件夹查看文件
#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){ @autoreleasepool ...
