电话连线
来源:互联网 发布:阮仪三 知乎 编辑:程序博客网 时间:2024/04/27 17:08
题目描述 Description
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
输入描述 Input Description
输入文件的第一行是n的值(n<=100).
第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。
输出描述 Output Description
输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <algorithm>#include <cstring>#define INF 0xffffffusing namespace std;bool used[110];int main(){ int w[110][110]; int p[110],d[110],a[110],b[110]; int n,ans=0,sum=0,pos,minn; memset(d,0,sizeof(d)); memset(used,false,sizeof(used)); cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>w[i][j]; used[1]=true; for(int i=1;i<=n;i++) d[i]=w[1][i]; for(int i=1;i<=n;i++) p[i]=1; for(int i=1;i<=n-1;i++) { minn=10000000; for(int j=1;j<=n;j++) if(!used[j]&&d[j]<minn) { minn=d[j]; pos=j; } used[pos]=true; if(w[p[pos]][pos]!=0) { ans++; sum+=w[p[pos]][pos]; if(p[pos]>pos) { a[ans]=pos; b[ans]=p[pos]; }else{ a[ans]=p[pos]; b[ans]=pos; } } for(int k=1;k<=n;k++) { if(!used[k]&&d[k]>w[pos][k]) { d[k]=w[pos][k]; p[k]=pos; } } } cout<<ans<<endl; for(int i=1;i<=ans;i++) cout<<a[i]<<" "<<b[i]<<endl; cout<<sum<<endl; return 0;}
0 0
- 电话连线
- 【wikioi】1003 电话连线
- wiki1003电话连线
- 1003 电话连线
- CodeVS 1003 电话连线
- codevs1003电话连线
- CODEVS 电话连线
- code vs电话连线
- 【codevs 1003】电话连线
- 【codevs 1003】电话连线
- codevs 1003 电话连线
- 1003 电话连线
- codevs 1003 电话连线
- Codevs 1003 电话连线
- codevs 1003 电话连线
- Codevs 1003 电话连线
- Code Vs 1003 电话连线
- CODE[VS] 1003 电话连线
- CSS3 参考指南:animation
- Unique Binary Search Trees II
- PHP匿名函数
- ipython[notebook]安装(Linux平台)
- 数据库面试题
- 电话连线
- .net SemaphoreSlim multi Thread controller
- jqGrid 多行数据修改并一起提交
- 通过windows任务计划来备份数据库以及检测apache是否正常运行-sever 2008 Apache优化配置
- 部署项目中出错
- 使用DOM4J解析大容量XML文件
- Code Forces 298 A EXAM
- 各个公司对前端工程师的招聘要求
- 8 个最好的 jQuery 树形 Tree 插件