第44课 - 最小连通网

1. 运营商的挑战

在下图标出的城市之间架设一条通信线路。

要求:任意两个城市间能够通信,将架设成本降至最低。

2. 问题的提出

如何在图中选择n-1条表使得n个顶点间两两可达,使得这n-1条边的权值之和最小。

(1)      必须使用且仅使用该网络中的n-1条边来连接网络中的n个结点;

(2)      不能使用产生回路的边;

(3)      各个边上的权值的总和达到最小。

3. Prim算法

从图N = {V, E}中选择某一个顶点u0进行标记,之后选择与它关联的具有最小权值的边(u0, v),并且将顶点v进行标记。

反复在一个顶点被标记,而在另一个顶点未被标记的各条边中选择权值最小的边(u0, v),并将为标记的顶点进行标记。

4. 算法步骤

(1)      从某一个顶点u0出发,使得U = {u0},TE={}

(2)      每次选择一条边,这条边是所有(u, v)中权值最小的边,而且,。修改U和TE:,。

(3)      当时,转2,;否则,结束。

5. 程序—Prim算法的实现

#include <stdio.h>

#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

#define VNUM 9

#define MV 65536

int P[VNUM];

int Cost[VNUM];

int Mark[VNUM];

int Matrix[VNUM][VNUM] =

{

{0, 10, MV, MV, MV, 11, MV, MV, MV},

{10, 0, 18, MV, MV, MV, 16, MV, 12},

{MV, 18, 0, 22, MV, MV, MV, MV, 8},

{MV, MV, 22, 0, 20, MV, MV, 16, 21},

{MV, MV, MV, 20, 0, 26, MV, 7, MV},

{11, MV, MV, MV, 26, 0, 17, MV, MV},

{MV, 16, MV, MV, MV, 17, 0, 19, MV},

{MV, MV, MV, 16, 7, MV, 19, 0, MV},

{MV, 12, 8, 21, MV, MV, MV, MV, 0},

};

void Prim(int sv) // O(n*n)

{

int i = 0;

int j = 0;

if( (0 <= sv) && (sv < VNUM) )

{

for(i=0; i<VNUM; i++)

{

Cost[i] = Matrix[sv][i];

P[i] = sv;

Mark[i] = 0;

}

Mark[sv] = 1;

for(i=0; i<VNUM; i++)

{

int min = MV;

int index = -1;

for(j=0; j<VNUM; j++)

{

if( !Mark[j] && (Cost[j] < min) )

{

min = Cost[j];

index = j;

}

}

if( index > -1 )

{

Mark[index] = 1;

printf("(%d, %d, %d)\n", P[index], index, Cost[index]);

}

for(j=0; j<VNUM; j++)

{

if( !Mark[j] && (Matrix[index][j] < Cost[j]) )

{

Cost[j]  = Matrix[index][j];

P[j] = index;

}

}

}

}

}

int main(int argc, char *argv[])

{

Prim(0);

return 0;

}

思考:

既然最小联通网是以边的权值之和为最终目标,那么是不是可以直接选择边,而不是通过顶点来选择边呢?

6. Kruskal算法

(1)      对于n个顶点的图G = {V, E}。

(2)      构造一个只有n个顶点,没有边的图。

(3)      在E中选择一条具有最小权值的边,若该边的两个顶点不构成回路,则将此边加入到T中;否则将此边社区,重新选择一条权值最小的边。

(4)      如此重复吓阻,直到所有顶点都联通位置。

7. Kruskal算法实现

步骤1:

定义边结构体

typedef struct _tag_Edge

{

int begin;

int end;

int weight;

}TEdge;

步骤2:

定义边集数组并排序

begin

end

weight

edges[0]

4

7

7

edges[1]

2

8

8

edges[2]

0

1

10

edges[3]

0

5

11

edges[4]

1

8

12

edges[5]

3

7

16

edges[6]

1

6

16

edges[7]

5

6

17

edges[8]

1

2

18

edges[9]

6

7

19

edges[10]

3

4

20

edges[11]

3

8

21

edges[12]

2

3

22

edges[13]

3

6

24

edges[14]

4

5

26

步骤3:

定义辅助数组P[n],其中n为顶点数目。

P[]用于记录边顶点的首位连接关系。

8. Kruskal算法核心思想

遍历edges数组中的每一个元素。

通过P数组查找begin顶点的最终连接点v1

通过P数组查找end顶点的最终连接点v2.

v1 != v2则:当前边为最小连通网中的边,记录连接关系,P[v1] = v2;

v1 == v2则:产生回路,舍弃当前边。

算法举例:

小结:

(1)      Prim算法是针对顶点展开的,适合于边的数量较,适合于边的数量较多的情况。

(2)      Kruskal算法是针对边展开的,适合于边的数量较,适合于边的数量较少的情况。

转载于:https://www.cnblogs.com/free-1122/p/11336083.html

数据--第44课 - 最小连通网相关推荐

  1. 【例4-4】最小花费

    [例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344 时间限制: 1000 ms         内存限制: 65536 ...

  2. M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课

    M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chin ...

  3. 信息学奥赛一本通 1344:【例4-4】最小花费 | 洛谷 P1576 最小花费

    [题目链接] ybt 1344:[例4-4]最小花费 洛谷 P1576 最小花费 [题目考点] 1. 图论 单源最短路径 时间复杂度: Dijkstra算法: O(V2)O(V^2)O(V2) Dij ...

  4. 当且仅当函数依赖a→b在r上成立_数据库第06章关系数据理习题课.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp数据结构与算法 数据库第06章关系数据理习题课.ppt36页 本 ...

  5. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

    知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...

  6. 大数据入门第一课 Hadoop基础知识与电商网站日志数据分析

    大数据入门第一课 Hadoop基础知识与电商网站日志数据分析 本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS.YARN.MapRedu ...

  7. 视频教程-大数据分析师实战课-大数据

    大数据分析师实战课 任老师,Cloudera管理/开发/分析认证讲师,华为高级特聘讲师,新华三大学高级特聘讲师,中国大数据技术与应用联盟高级讲师,全国高校大数据联盟特聘讲师,中国移动高级讲师,前IBM ...

  8. 堆排序及从10亿个数据中找出最小或最大的10个数

    高频面试题目 一.堆排序 1.基础知识 * ------基本知识: * 1. 堆数据结构特征: * 大顶堆:所有父节点大于等于左右子节点,arr[i] >= arr[2i+1] &&am ...

  9. 大数据学习第一课:虚拟机安装配置

    本章主要内容 VirtualBox下安装CentOS7 Minimal版本 Minimal版本Centos7静态IP网络设置 ssh免密登录设置 我们现在身处数据时代,大数据和人工智能已经逐渐渗透到我 ...

  10. Python数据可视化(微课版)-简介

    前 言 当前,我们正处于大数据爆发的时代,涌现出大量不同类型的时空数据和非时空数据,信息激流使个人.企业和社会对大数据的依赖不断深化,与此同时,数据可视化研究已成为一个新的时代命题,与立体建模等方法相 ...

最新文章

  1. QT解决方案中新建动态链接库工程,且继承于QObject,解决无法生成moc_XXX.cpp文件的问题,解决工程之间的引用问题
  2. 《D3.js数据可视化实战手册》——2.5 使用子选择器
  3. html sql注入_Web安全-SQL注入(sqli-lab)
  4. nginx下只能通过域名,禁止使用ip访问
  5. STL中map的使用要点
  6. react-draft-wysiwyg富文本的使用
  7. 大数据学习笔记26:MR案例——双重排序(先按月份升序,再按利润降序)
  8. linux命令只有一个文件,一天一个Linux基础命令之文件查看命令more
  9. 那些还在传程序猿35岁职业危机
  10. 学到了!程序员大神用这招让开发效率直接提升10倍!!
  11. 翻译:自动驾驶相关术语的分类和定义Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated
  12. 使用COOC软件绘制复杂网络
  13. PreferenceActivity
  14. 【接箱子2.0】新手划过,dalao勿喷
  15. 实战演练 | Navicat Premium 轻松连接阿里云云数据库
  16. oracle如何某个字段去重复的数据,Oracle 去重复的数据
  17. 异步调用案例_异步案例研究
  18. idea自定义背景图片
  19. unsteady_rel_perm案例学习
  20. 反向传播 - 李宏毅机器学习笔记

热门文章

  1. Kubernetes持久化方案(PV、PVC、StorageClass)
  2. Python基础语法-03-私有化
  3. Android 属性动画简单分析(二)
  4. python设置窗体标题_Python3 tkinter基础 TK title 设置窗体的标题
  5. Android仿IOS有弹性ScrollView
  6. Android反编译与加密(代码混淆)
  7. 金蝶移动bos开发教程_移动安全(四)|NDK开发教程_JavaToC
  8. python exec函数_Python3
  9. gpio能测Linux启动时间,linux – 如何自动测量新建图像的启动时间...
  10. python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全