【管理运筹学】背诵手册(六)| 图与网络分析(基本概念、最小支撑树问题、最短路问题)

六、图与网络分析

基本概念、术语

某个边的两个端点相同,称为环;两点之间有多于一条的边,成为多重边。一个无环、无多重边的图称为简单图,无环但允许有多重边的图称为多重图

次:以 v i v_i vi 为端点的边的数目称为点 v i v_i vi G G G 中的次,记为 d ( v i ) d(v_i) d(vi) 。如果有环,按两条边记。

所有点的次之和为边的两倍,即 ∑ d ( v i ) = 2 m \sum d(v_i)=2m d(vi)=2m m m m 为图的边数。

奇数次顶点的个数总为偶数。简单证明为:将所有点分为奇数次点和偶数次点,两者的次相加为 2 m 2m 2m ,则奇数次点的个数为 2 m 2m 2m (偶数)减去偶数次点的次(偶数),结果仍为偶数。

次为 1 的点称为悬点,其所关联的边为悬边。次为 0 的点位孤立点。

链中所有顶点都不同,称为初等链;所有边都不同,称为简单链;链的长度为所包含的边数。

平凡图:点数 n = 1 n=1 n=1 ,边数 m = 0 m=0 m=0 的图。零图:边数 m = 0 m=0 m=0 的图。

连通图:每对节点都有一条链(路)连通。树:无圈连通图。

正则图:每个点的次数均相同。

子图是对点或边做删除运算,支撑子图点必须一样,边可以有所减少。

邻接矩阵,相邻两个顶点连通则对应元素为 1 ,反之为 0 ,对角线元素为 0 。

可达矩阵,只要能连通,那对应元素就为 1 ,反之为 0 ,对角线元素为 1 。

关联矩阵,横的是点,纵的是边,点如果是边的起点,对应元素为 1 ;是边的终点,则对应元素为 -1 ;若无关,则对应元素为 0 。

权矩阵,相邻两点可连通就是权,不可到就是无穷,对角线元素为 0 。

最小支撑树问题

无圈的连通图称为树。

T T T 为树,且树中点的个数 n T ≥ 2 n_T\geq2 nT2 ,则 T T T 中至少有两个悬挂点。

T T T 是树,则 T T T 中的边数 m m m 等于点数 n n n 减一,即 m = n − 1 m=n-1 m=n1

注意这是一个必要条件,即如果 m = n − 1 m=n-1 m=n1 ,图 G G G 不一定是树,比如一个三角形加上一个孤立点。

T T T 是树的充分必要条件是任意两个顶点之间恰有一条链。

设图 T T T 是图 G G G 的支撑子图,如果 T T T 是一个树,称其为 G G G 的一个支撑树。

G G G 有支撑树的充分必要条件是图 G G G 是连通的。

最小支撑树有两个定理:

  1. 对任意一个树外的边,唯一决定一个圈,如果树是最小支撑树,则该边是那个圈里面的最大边。
  2. 对于任意一个树上的边,唯一决定一个割集,如果树是最小支撑树,则该边是割集里最小边。

避圈法,将网络中的边按权大小排序,从最小边选起,保证不构成圈,直到边数等于点数减一为止。

破圈法,每次找一个圈,去掉里面最大的边,直到没有圈。

最短路问题

最短路问题的网络模型如下: min ⁡ z = ∑ ( i , j ) ∈ E c i j x i j s . t . { x 12 + x 13 + x 15 = 1 x 13 + x 23 − x 34 − x 35 = 0 x 57 + x 67 = 1 ⋯ x i j = 0 或 1 , ( i , j ) ∈ E \min z=\sum_{(i,j)\in E} c_{ij}x_{ij} \\ s.t.\begin{cases} x_{12}+x_{13}+x_{15}=1\\ x_{13}+x_{23}-x_{34}-x_{35}=0\\ x_{57}+x_{67}=1 \\ \cdots \\ x_{ij}=0或1,(i,j)\in E\end{cases} minz=(i,j)Ecijxijs.t. x12+x13+x15=1x13+x23x34x35=0x57+x67=1xij=01,(i,j)E 其中, c i j c_{ij} cij 表示点 v i → v j v_i\to v_j vivj 的距离, x i j x_{ij} xij 表示最短路是否经过弧 ( i , j ) (i,j) (i,j) 。决策变量个数为边的个数,约束条件个数为点的个数。约束条件中,第一个约束表示起点连接的边只能有一个在最短路中;中间的约束为中间点的约束,连进中间点的等于从中间点连出的;最后一个约束表示连进终点的边只能有一个在最短路中。

Dijkstra 算法

步骤:

  1. 初始化,令 k = 0 k=0 k=0 S ( 0 ) = { v s } S^{(0)}=\{v_s\} S(0)={vs} ,表示永久标号点的集合, T ( 0 ) = { v 1 , v 2 , ⋯   , v n } T^{(0)}=\{v_1,v_2,\cdots,v_n\} T(0)={v1,v2,,vn} 表示临时标号点的集合, d ( 0 ) ( v s ) = 0 , d ( 0 ) ( v i ) = ∞ ( v i ∈ T ( 0 ) ) d^{(0)}(v_s)=0,d^{(0)}(v_i)=\infty(v_i\in T^{(0)}) d(0)(vs)=0,d(0)(vi)=(viT(0)) λ ( 0 ) ( v i ) = v s , r e s e n t = v s \lambda^{(0)}(v_i)=v_s,resent=v_s λ(0)(vi)=vs,resent=vs ,表示最新获得永久标号的顶点。
  2. k = k + 1 k=k+1 k=k+1 ,对 v l ∈ T ( k − 1 ) v_l\in T^{(k-1)} vlT(k1) ,计算: d ( k ) ( v l ) = min ⁡ { d ( k − 1 ) ( v l ) , d ( r e s e n t ) + w ( r e s e n t , v l ) } d^{(k)}(v_l)=\min\{d^{(k-1)}(v_l),d(resent)+w(resent,v_l)\} d(k)(vl)=min{d(k1)(vl),d(resent)+w(resent,vl)} 如果 d ( k ) ( v l ) < d ( k − 1 ) ( v l ) , λ ( k ) ( v l ) = r e s e n t d^{(k)}(v_l)<d^{(k-1)}(v_l),\lambda^{(k)}(v_l)=resent d(k)(vl)<d(k1)(vl),λ(k)(vl)=resent ;否则, λ ( k ) ( v l ) = λ ( k − 1 ) ( v l ) \lambda^{(k)}(v_l)=\lambda^{(k-1)}(v_l) λ(k)(vl)=λ(k1)(vl)
  3. v k v_k vk 满足 v k = min ⁡ { d ( k ) ( v l ) } v_k=\min\{d^{(k)}(v_l)\} vk=min{d(k)(vl)} ,则 r e s e n t = v k resent=v_k resent=vk S ( k ) = S ( k − 1 ) ⋃ { v k } , T ( k ) = T ( k − 1 ) − { v k } S^{(k)}=S^{(k-1)}\bigcup\{v_k\},T^{(k)}=T^{(k-1)}-\{v_k\} S(k)=S(k1){vk},T(k)=T(k1){vk} 。若 k = n k=n k=n ,则算法结束,否则转第二步。

实际写题这样写麻烦且不直观,可以用表格写法。

在这里插入图片描述
大概是这样,这样每次都可以对照 S + w i j S+w_{ij} S+wij T T T 。从 T T T 中选择最小的标记一下,等所有标记完,就可以依次回溯到最短路。

Bellman-Ford 算法

Dijkstra 的一个缺点就是有负权就不能用,Bellmam-Ford 适用于有负权但不含负回路的有向赋权图。根据下标依次计算,如 d 12 = min ⁡ { d 11 + w 12 , d 12 + w 22 + ⋯   } d_{12}=\min\{d_{11}+w_{12},d_{12}+w_{22}+\cdots\} d12=min{d11+w12,d12+w22+}
如果第 3 项最小,说明 v 3 v_3 v3 v 1 → v 2 v_1\to v_2 v1v2 最短路的终点 v 2 v_2 v2 的前一个顶点号。

Floyd 算法

前面两个算法是计算单源到多个顶点的最短路问题,而 Floyd 算法可以求任意两个顶点之间的最短路,且适用于有负权网络。它的思想是比较直接到达和经过一个中间点到达,哪个距离更短。每次记录的路径标号表示最短路的第一条弧的终点。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis序列化操作

目录 1.protostuff 的 Maven 依赖 2.定义实体类 3.序列化工具类 ProtostuffSerializer 提供了序列化和反序列化方法 4.测试 利用 Jedis 提供的字节数组参数方法&#xff0c;如&#xff1a; public String set(String key, String value) public String set(byte[] key…

IDEA DeBug

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 01_Debug简介和意义 什么是程序DeBug&am…

人力资源管理后台 === 主页模块

目录 1.获取用户资料在Vuex中共享 2.显示用户头像和用户名 3.处理头像为空的场景 4.处理token失效的问题 5.调整下拉菜单&#xff0c;实现退出登录 6.修改密码功能实现 6.1-修改密码-弹出层 6.2-修改密码-表单结构 6.3-修改密码-表单校验 6.4-修改密码-确定和取消 7.…

设计模式精讲:掌握单例模式的实现与优化

掌握单例模式的实现与优化 一、引言&#xff1a;如何学习设计模式&#xff1f;二、前置知识&#xff1a;对象的创建的销毁2.1、拷贝构造2.2、拷贝赋值构造2.3、移动构造2.4、移动赋值构造 三、单例模式的定义四、单例模式的实现与优化4.1、版本一4.2、版本二4.3、版本三4.4、版…

均匀球形分布的随机三维单位向量

生成具有均匀球形分布的随机三维单位向量[参考] import numpy as np import matplotlib.pyplot as plt def random_three_vector():"""Generates a random 3D unit vector (direction) with a uniform spherical distributionAlgo from http://stackoverflow.c…

论文阅读:C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range SLAM

前言 论文全程为C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range Simultaneous Localization and Mapping&#xff0c;是发表在MDPI drones&#xff08;二区&#xff0c;IF4.8&#xff09;上的一篇论文。这篇文章使用单目相机、惯性测量单元( IMU )和UWB设备作为…

Node——npm包管理器的使用

Node.js使用npm对包进行管理&#xff0c;其全称为Node Package Manager&#xff0c;开发人员可以使用它安装、更新或者卸载Node.js的模块 1、npm包管理器基础 1.1、npm概述 npm是Node.js的标准软件包管理器&#xff0c;其在2020年3月17日被GitHub收购&#xff0c;而且保证永…

1.9 字符数组

1.9 字符数组 一、字符数组概述二、练习 一、字符数组概述 所谓字符数组&#xff0c;就是char类型的数组&#xff0c;比如 char a[]&#xff0c;是C语言中最常用的数组类型&#xff0c;先看一个程序 #include <stdio.h> #define MAXLINE 1000 //最大行长度限制 int get…

软件介绍02- flameshot截图软件(linux系统可用)

1 软件介绍 在Windows和mac平台一直都使用着snipaste截图&#xff0c;非常好用&#xff0c;又能够钉图。遗憾是并没有开发linux版本&#xff0c;真不知道为什么。 好在终于找到一款截图软件&#xff0c;flameshot截图软件&#xff0c;可以平替snipaste。 下载网址&#xff1a;…

什么是好的FPGA编码风格?(3)--尽量不要使用锁存器Latch

前言 在FPGA设计中&#xff0c;几乎没人会主动使用锁存器Latch&#xff0c;但有时候不知不觉中你的设计莫名其妙地就生成了一堆Latch&#xff0c;而这些Latch可能会给你带来巨大的麻烦。 什么是锁存器Latch&#xff1f; Latch&#xff0c;锁存器&#xff0c;一种可以存储电路…

【Linux】进程间通信

进程间通信 1. 进程间通信介绍1.1 进程间通信目的1.2 进程间通信发展1.3 进程间通信分类1.4 进程间通信的本质理解 2. 管道3. 匿名管道3.1 pipe()函数3.2 站在文件描述符角度-深度理解管道3.3 站在内核角度-管道本质3.4 匿名管道使用步骤3.4 管道读写规则3.5 管道的读与写的五种…

复数的乘幂与方根

1、乘积与商 设 几何意义&#xff1a; &#xff1a;逆时针旋转一个角度&#xff0c;并伸长倍 &#xff1a;顺时针旋转一个角度&#xff0c;并伸长倍 *特别&#xff1a;不存在 :对实行了一次旋转变换&#xff0c;且长度不变&#xff0c;旋转角为 例题&#xff1a; 2、幂与…

windows下docker环境搭建与运行实战

背景 学习docker使用&#xff0c;需要环境&#xff0c;今天主要的目标是在windows环境下安装docker环境。 为什么要这么搞&#xff0c;主要是企业内部服务器&#xff0c;都是跟公网隔离的&#xff0c;没有访问公网权限&#xff0c;所以镜像什么的&#xff0c;从公网拉取完全没…

MySQL的undo log 与MVCC

文章目录 概要一、undo日志1.undo日志的作用2.undo日志的格式3. 事务id&#xff08;trx_id&#xff09; 二、MVCC1.版本链2.ReadView3.REPEATABLE READ —— 在第一次读取数据时生成一个ReadView4.快照读与当前读 小结 概要 Undo Log&#xff1a;数据库事务开始之前&#xff0…

qt-C++笔记之不使用ui文件纯C++构建时控件在布局管理器作用下的默认位置和大小实践

qt-C笔记之不使用ui文件纯C构建时控件在布局管理器作用下的默认位置和大小实践 code review! 文章目录 qt-C笔记之不使用ui文件纯C构建时控件在布局管理器作用下的默认位置和大小实践1.ChatGPT解释2.ChatGPT——resize()和move()详解3.默认大小和位置——示例运行一4.默认大小…

31 - MySQL调优之SQL语句:如何写出高性能SQL语句?

从今天开始&#xff0c;我将带你一起学习 MySQL 的性能调优。MySQL 数据库是互联网公司使用最为频繁的数据库之一&#xff0c;不仅仅因为它开源免费&#xff0c;MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。 我们知道&#xff0c;应用服务与数据库的交…

3D建模对制造企业的价值

除非你在过去几年一直躲在岩石下,否则你可能听说过“3D 建模”和“3D 渲染”这些术语。 但为什么这项技术如此重要,尤其是对于产品制造公司而言? 简而言之,它减少了项目时间和成本。 这为制造商提供了更多的设计试验空间。 未能利用 3D 建模技术的公司很快就会落后于竞争对…

MYSQL基础之【正则表达式,事务处理】

文章目录 前言MySQL 正则表达式MySQL 事务事务控制语句事务处理方法PHP中使用事务实例 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不…

P18 C++ 继承

目录 前言 01 不使用继承会让你多打很多无用的代码 02 继承 最后的话 前言 本期我们学习 C 面向对象编程中的继承。 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#…

BC77 简单计算器(牛客)

#include <stdio.h> int main() {double a, b, d;//用来接收浮点数char c;//用来接受符号scanf("%lf %c %lf", &a, &c, &b);if (c || c - || c * || c /)//判断输入的运算符号不包括在&#xff08;、-、*、/&#xff09;范围内{switch (c)//根…