最优布线问题

题目

学校有 n n n 台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。
当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机( 作为中转 )来实现与另一台计算机的连接。
现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通( 不管是直接的或间接的 )。

输入

第一行为整数 n n n ( 2 < = n < = 100 ) ( 2 <= n <= 100 ) (2<=n<=100),表示计算机的数目。此后的 n n n 行,每行 n n n 个整数。第 x + 1 x+1 x+1 行 y y y 列的整数表示直接连接第 x x x 台计算机和第 y y y 台计算机的费用。

输出

一个整数,表示最小的连接费用。

样例

input

3
0 1 2
1 0 1
2 1 0

output

2 ( 注 : 表 示 连 接 1 和 2 , 2 和 3 , 费 用 为 2 ) ( 注:表示连接1和2,2和3,费用为2) (注:表示连接1和2,2和3,费用为2)

解题思路

两种方法

第一种: 普里姆算法 ( p r i m ) (prim) (prim)
蓝白点思想:白点入队,蓝点未入
每次循环将一个蓝点变为白点,此蓝点和白点连接的路径是当前所有蓝点中最短
并更新剩下的蓝点和白点之间的最短距离

初始所有都是蓝点
m [ 1 ] = 0 m[1]=0 m[1]=0
m [ 2 − n ] = ∞ m[2-n]=∞ m[2−n]=∞

先找到点 1 1 1,变为白点,并更新跟它相连的 2 2 2, 3 3 3, 4 4 4 到白点的距离
m [ 2 ] = 2 m[2]=2 m[2]=2
m [ 3 ] = 4 m[3]=4 m[3]=4
m [ 4 ] = 7 m[4]=7 m[4]=7

第二次找到当前蓝点中与白点相连最短的点 2 2 2,变为白点
更新与它相连的 3 3 3, 5 5 5 到白点的距离
m [ 3 ] = 1 m[3]=1 m[3]=1
m [ 5 ] = 2 m[5]=2 m[5]=2

第三次找到当前蓝点中与白点相连最短的点 3 3 3,变为白点
更新与它相连的 4 4 4, 5 5 5 到白点的距离
m [ 4 ] = 1 m[4]=1 m[4]=1
m [ 5 ] = 2 m[5]=2 m[5]=2 因为原来到达 5 的距离更短,所以不变

最后两次,依次把点 4 4 4 和点 5 5 5 添加进树

第二种:克里斯科尔 ( k r u s k a l ) (kruskal) (kruskal)
初始所有点属于不同的集合,自己属于自己
每次循环找到两个不同的集合的最短路径,合并集合
直到所有点在同一集合

点与点的权值

第一次

第二次

第三次

第四次

第五次

代码

第一种: 普里姆算法 ( p r i m ) (prim) (prim)

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a[120][120],m[120],p[120];
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%d",&a[i][j]);memset(m,0x7f,sizeof(m));  //初始所有蓝点与白点之间无穷大memset(p,0,sizeof(p));m[1]=0;  //点1初值为0for (int i=1;i<=n;i++){int k=0;for (int j=1;j<=n;j++)if (p[j]==0&&m[j]<m[k])k=j;  //找到当前与白点相连最短的蓝点p[k]=1;ans+=m[k];  //累加代价for (int j=1;j<=n;j++)if (p[j]!=1&&a[k][j]<m[j])m[j]=a[k][j];  //更新此蓝点到白点的距离}cout<<ans<<endl;return 0;
}

第二种:克里斯科尔 ( k r u s k a l ) (kruskal) (kruskal)

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
const int INF=0x7ffffff;
int a[120][120],p[120],x,y;
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++)scanf("%d",&a[i][j]);p[i]=i;  //自己属于自己的集合}for (int i=1;i<=n-1;i++){int mi;mi=INF;for (int j=1;j<=n;j++)for (int k=1;k<=n;k++)if (p[j]!=p[k]&&a[j][k]!=0&&a[j][k]<mi)  //分属于不同的集合并且有路而且路比当前最小还小{  mi=a[j][k];x=j;y=k;  //存当前最短路径的起点与终点}ans+=mi;  //累加代价int s=p[y],t=p[x];  //要另存,不然p[y]被改后,属于它的集合的别的点没有被合并for (int j=1;j<=n;j++)if (p[j]==s)  //合并集合p[j]=t;}cout<<ans<<endl;return 0;
}

最优布线问题 题解相关推荐

  1. 最小生成树(模板题:最优布线问题,繁忙的都市,联络员)(C++)

    文章目录 序言 正文 First Promble 最优布线问题 时间限制: 1000 m s 1000 ms 1000ms 空间限制: 262144 K B 262144 KB 262144KB 题目 ...

  2. 1231 最优布线问题

    1231 最优布线问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接 ...

  3. 【prim】【最小生成树】最优布线问题(ssl 1612)

    最优布线问题 ssl 1612 题目大意: 求最小生成树 原题: 题目描述 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们之间有数据线连接.由于计算机所处的位 ...

  4. 最优布线问题(三种方法)

    最优布线问题 题目 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们之间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当 ...

  5. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  6. 最优布线问题(克鲁斯卡尔)

    题意 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们之间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将任意 ...

  7. 最优布线问题(普里姆算法)

    题意 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们之间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将任意 ...

  8. 信息学奥赛一本通1349-最优布线问题

    [题目描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将 ...

  9. 最优布线问题(信息学奥赛一本通-T1349)

    [题目描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将 ...

最新文章

  1. 大数据时代涉军网络舆情引导的“5个结合”
  2. 文本在计算机中的编码表示方法,计算机中数字、文字、图像、声音和视频的表示与编码...
  3. Linux进程top命令作用是,Linux中top命令起什么作用呢?
  4. 独家 | 大数据与AI技术在金融科技的应用
  5. python之禅星号_Python基础1
  6. html网页制作每周食谱,新增食谱.html
  7. 诗与远方:无题(七十七)- 远方
  8. Leviathan系列4-7
  9. 枚举一个集合的所有子集
  10. POJ 2182 Lost Cows (线段树)
  11. faststone capture 屏幕录像没有声音
  12. 跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科
  13. 支付宝退款流程 php,支付宝退款接口对接流程PHP语言
  14. Objective-C简介
  15. summation()
  16. 实现Vue移动端的PDF预览
  17. python批量pdf转word_Python:PDF批量转Worde+PDF图片快速提取(附源代码)-Go语言中文社区...
  18. Linux 系统 pptpd+radius+mysql 安装攻略
  19. 直通车拼多多7天均价比价
  20. OpenCV小例程——分区域不同的显示视频

热门文章

  1. 因子分析累计贡献率_累计方差贡献率_spss累计方差贡献率_因子分析方差贡献率...
  2. 中英文翻译功能 php,PHP微信开发之翻译功能
  3. 微信小程序评论功能的实现(用的是假数据)
  4. 谷歌学术+SCI-HUB一键下载SCI文献
  5. Microsoft Visual Studio 2003 2005 2008 2010 2012 下载
  6. Python利用SMTP/IMTP制作简单邮件(QQ邮箱)发送程序(保姆级)
  7. Android 9,安卓开发项目实战
  8. intel linux核显性能,Intel UHD Graphics 630 核显性能解析
  9. 断点恢复执行时的设置
  10. windowxp网络无法发现其他计算机,几个步骤轻松解决win7无法访问XP系统共享问题...