codevs1003 电话连线
2016-06-21 20:06
260 查看
题目描述 Description
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
![](http://codevs.cn/media/image/problem/1003.png)
输入描述 Input Description
输入文件的第一行是n的值(n<=100).
第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。
输出描述 Output Description
输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i<j), i j是电话线连接的两个城市。输出请按照Prim算法发现每一条边的顺序输出,起始点为1.
第m+2行是连接这些电话线的总费用。
样例输入 Sample Input
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
样例输出 Sample Output
2
1 4
2 5
17
数据范围及提示 Data Size & Hint
n<=100
正解:最小生成树
解题报告:
现在每天只能刷一点水题。。。这题还真是傲娇,居然只能用prim。。。其实我都快忘了prim是什么了
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
![](http://codevs.cn/media/image/problem/1003.png)
输入描述 Input Description
输入文件的第一行是n的值(n<=100).
第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。
输出描述 Output Description
输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i<j), i j是电话线连接的两个城市。输出请按照Prim算法发现每一条边的顺序输出,起始点为1.
第m+2行是连接这些电话线的总费用。
样例输入 Sample Input
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
样例输出 Sample Output
2
1 4
2 5
17
数据范围及提示 Data Size & Hint
n<=100
正解:最小生成树
解题报告:
现在每天只能刷一点水题。。。这题还真是傲娇,居然只能用prim。。。其实我都快忘了prim是什么了
//It is made by jump~ #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <ctime> #include <vector> #include <queue> #include <map> #include <set> #ifdef WIN32 #define OT "%I64d" #else #define OT "%lld" #endif using namespace std; typedef long long LL; const int MAXN = 111; const int inf = (1<<30); int n,cnt; int a[MAXN][MAXN]; bool vis[MAXN]; int low[MAXN]; int next[MAXN]; int ans; struct edge{ int s,t; }e[MAXN]; inline int getint() { int w=0,q=0; char c=getchar(); while((c<'0' || c>'9') && c!='-') c=getchar(); if (c=='-') q=1, c=getchar(); while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w; } inline void solve(){ n=getint(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=getint(); for(int i=1;i<=n;i++) low[i]=inf; low[1]=0; for(int i=1;i<=n;i++) { int minl=inf; int jilu; for(int j=1;j<=n;j++) if(!vis[j] && minl>low[j]) { minl=low[j]; jilu=j; } ans+=minl; vis[jilu]=1; for(int j=2;j<=n;j++) if(!vis[j] && a[jilu][j]<low[j]) { low[j]=a[jilu][j]; next[j]=jilu; } if(minl) { e[++cnt].s=jilu; e[cnt].t=next[jilu]; } } printf("%d\n",cnt); for(int i=1;i<=cnt;i++) { if(e[i].s>e[i].t) swap(e[i].s,e[i].t); printf("%d %d\n",e[i].s,e[i].t); } printf("%d",ans); } int main() { solve(); return 0; }
相关文章推荐
- poj 2229 Sumsets 完全背包求方案总数
- 第三次冲刺演示
- 第十三周项目四立体类族共有的抽象类
- Java的递归
- volley源码分析
- opencv批处理提取图像的特征
- UIApplication深入研究
- DOM解析XML文件并添加到数据库中
- 自己动手写HTTP框架:异步任务篇
- [Java并发包学习七]解密ThreadLocal
- 【随记】cxf的webservice接口实现
- 分布式设计与开发(二)------几种必须了解的分布式算法
- jsp和servlet中文乱码
- flexslider轮播器插件【兼容IE6】
- 把数组变成以特定字符连接的字符串
- 如何使用MySQL的 group_concat函数
- 工具类
- [POJ1159]Palindrome(dp,滚动数组)
- JZ2440 usb设备驱动
- Thrift学习笔记