数据--第44课 - 最小连通网
第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课 - 最小连通网相关推荐
- 【例4-4】最小花费
[例4-4]最小花费 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1344 时间限制: 1000 ms 内存限制: 65536 ...
- M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课
M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chin ...
- 信息学奥赛一本通 1344:【例4-4】最小花费 | 洛谷 P1576 最小花费
[题目链接] ybt 1344:[例4-4]最小花费 洛谷 P1576 最小花费 [题目考点] 1. 图论 单源最短路径 时间复杂度: Dijkstra算法: O(V2)O(V^2)O(V2) Dij ...
- 当且仅当函数依赖a→b在r上成立_数据库第06章关系数据理习题课.ppt
您所在位置:网站首页 > 海量文档  > 计算机 > 数据结构与算法 数据库第06章关系数据理习题课.ppt36页 本 ...
- python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验
知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...
- 大数据入门第一课 Hadoop基础知识与电商网站日志数据分析
大数据入门第一课 Hadoop基础知识与电商网站日志数据分析 本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS.YARN.MapRedu ...
- 视频教程-大数据分析师实战课-大数据
大数据分析师实战课 任老师,Cloudera管理/开发/分析认证讲师,华为高级特聘讲师,新华三大学高级特聘讲师,中国大数据技术与应用联盟高级讲师,全国高校大数据联盟特聘讲师,中国移动高级讲师,前IBM ...
- 堆排序及从10亿个数据中找出最小或最大的10个数
高频面试题目 一.堆排序 1.基础知识 * ------基本知识: * 1. 堆数据结构特征: * 大顶堆:所有父节点大于等于左右子节点,arr[i] >= arr[2i+1] &&am ...
- 大数据学习第一课:虚拟机安装配置
本章主要内容 VirtualBox下安装CentOS7 Minimal版本 Minimal版本Centos7静态IP网络设置 ssh免密登录设置 我们现在身处数据时代,大数据和人工智能已经逐渐渗透到我 ...
- Python数据可视化(微课版)-简介
前 言 当前,我们正处于大数据爆发的时代,涌现出大量不同类型的时空数据和非时空数据,信息激流使个人.企业和社会对大数据的依赖不断深化,与此同时,数据可视化研究已成为一个新的时代命题,与立体建模等方法相 ...
最新文章
- QT解决方案中新建动态链接库工程,且继承于QObject,解决无法生成moc_XXX.cpp文件的问题,解决工程之间的引用问题
- 《D3.js数据可视化实战手册》——2.5 使用子选择器
- html sql注入_Web安全-SQL注入(sqli-lab)
- nginx下只能通过域名,禁止使用ip访问
- STL中map的使用要点
- react-draft-wysiwyg富文本的使用
- 大数据学习笔记26:MR案例——双重排序(先按月份升序,再按利润降序)
- linux命令只有一个文件,一天一个Linux基础命令之文件查看命令more
- 那些还在传程序猿35岁职业危机
- 学到了!程序员大神用这招让开发效率直接提升10倍!!
- 翻译:自动驾驶相关术语的分类和定义Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated
- 使用COOC软件绘制复杂网络
- PreferenceActivity
- 【接箱子2.0】新手划过,dalao勿喷
- 实战演练 | Navicat Premium 轻松连接阿里云云数据库
- oracle如何某个字段去重复的数据,Oracle 去重复的数据
- 异步调用案例_异步案例研究
- idea自定义背景图片
- unsteady_rel_perm案例学习
- 反向传播 - 李宏毅机器学习笔记
热门文章
- Kubernetes持久化方案(PV、PVC、StorageClass)
- Python基础语法-03-私有化
- Android 属性动画简单分析(二)
- python设置窗体标题_Python3 tkinter基础 TK title 设置窗体的标题
- Android仿IOS有弹性ScrollView
- Android反编译与加密(代码混淆)
- 金蝶移动bos开发教程_移动安全(四)|NDK开发教程_JavaToC
- python exec函数_Python3
- gpio能测Linux启动时间,linux – 如何自动测量新建图像的启动时间...
- python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全