个人数学建模算法库之图的创建与可视化

news/2024/7/15 8:33:41 标签: 算法, 图论, 数据结构

图的创建与可视化

  • 图论术语
    • 无向图与有向图
      • 无向图
      • 有向图
    • 简单图,完全图与赋权图
    • 顶点的度
    • 子图与图的连通性
  • 图论表示
    • 边与顶点的关联矩阵
    • 顶点与顶点的邻接矩阵
  • matlab代码
    • 邻接矩阵创建图并显示
    • 顶点对创建图并显示
  • Python代码
    • 顶点对创建图并显示

图论术语

无向图与有向图

无向图

在这里插入图片描述

无向图:一个无向图 G G G,由非空顶点集 V = { v 1 , v 2 , . . . v n } V=\{v_1,v_2,...v_n\} V={v1,v2,...vn}和边集 E = { e 1 , e 2 , . . . e m } E=\{e_1,e_2,...e_m\} E={e1,e2,...em}组成,通常记作 G ( V , E ) G(V,E) G(V,E)

边与顶点:一条边连接两个顶点(可相同)。故任意一条边可由两个顶点表示: e k = ( v i , v j ) e_k=(v_i,v_j) ek=(vi,vj) 。顶点 v i , v j v_i,v_j vi,vj 称为边 e k e_k ek的端点。边 e k e_k ek与顶点 v i , v j v_i,v_j vi,vj关联。

无向图特点:无向图中的边没有方向,即 ( v i , v j ) = ( v j , v i ) (v_i,v_j)=(v_j,v_i) (vi,vj)=(vj,vi)

相邻:有公共端点的边称为相邻的边(邻边)。同一条边的两个端点,称为相邻的顶点。

有向图

在这里插入图片描述

:有方向的边称为弧。 a k = ( v i , v j ) a_k=(v_i,v_j) ak=(vi,vj) 代表弧 a k a_k ak从顶点 v i v_i vi出发指向顶点 v j v_j vj v i v_i vi称为 a k a_k ak的始端, v j v_j vj称为 a k a_k ak的末端。 a k a_k ak称为 v i v_i vi的出弧,称为 v j v_j vj的入弧。

有向图:一个有向图 D D D,由非空顶点集 V = { v 1 , v 2 , . . . v n } V=\{v_1,v_2,...v_n\} V={v1,v2,...vn}和弧集 A = { a 1 , a 2 , . . . a m } A=\{a_1,a_2,...a_m\} A={a1,a2,...am}组成,通常记作 G ( V , A ) G(V,A) G(V,A)

有向图特点:有向图中的边带有方向,即 ( v i , v j ) ≠ ( v j , v i ) (v_i,v_j)\ne(v_j,v_i) (vi,vj)=(vj,vi)

基本图与定向图 :有向图 D = ( V , A ) D=(V,A) D=(V,A)去掉所有边的方向后可以得到对应无向图 G = ( V , E ) G=(V,E) G=(V,E)。称 G G G D D D的基本图, G G G D D D的定向图。如无向图 G 1 G_1 G1与有向图 D 1 D_1 D1之间。

简单图,完全图与赋权图

在这里插入图片描述

:两个端点为同一个顶点的边

重边/平行边:有相同端点的两条或多条边

孤立点:与任何边都不关联的顶点

简单图:无环无重边的图

完全图:任意两顶点都相邻的简单图

赋权图(网络):每条边 e k e_k ek都附加一个权重 w k w_k wk的图 。可记作 N = ( V , E , W ) N=(V,E,W) N=(V,E,W)

在这里插入图片描述

顶点的度

顶点 v v v的度:无向图中,与顶点 v v v关联的边数;有向图中,弧从顶点 v v v出入的总次数。记作 d ( v ) d(v) d(v)

出度:有向图中,从顶点 v v v引出的弧的数目。记作 d + ( v ) d^+(v) d+(v)

入度:有向图中,引入顶点 v v v的弧的数目。记作 d − ( v ) d^-(v) d(v)

在有向图中, d ( v ) = d + ( v ) + d − ( v ) d(v)=d^+(v)+d^-(v) d(v)=d+(v)+d(v)

子图与图的连通性

子图/母图:设有图 G 1 ( V 1 , E 1 ) G_1(V_1,E_1) G1(V1,E1), G 2 ( V 2 , E 2 ) G_2(V_2,E_2) G2(V2,E2) .若 G 1 G_1 G1的顶点和边都在 G 2 G_2 G2中能找到,即 V 1 ⊂ V 2 , E 1 ⊂ E 2 V_1\subset V_2,E_1\subset E_2 V1V2,E1E2,则称 G 1 G_1 G1 G 2 G_2 G2的子图, G 2 G_2 G2 G 1 G_1 G1的母图。 G 2 G_2 G2删减若干个顶点和若干条边,可得到 G 1 G_1 G1

生成子图/支撑子图:若 G 1 G_1 G1 G 2 G_2 G2的子图且两者顶点相同,则称 G 1 G_1 G1 G 2 G_2 G2的生成子图/支撑子图。 G 2 G_2 G2删减若干条边可生成 G 1 G_1 G1

在这里插入图片描述

道路/路 :称 v 0 e 1 v 1 e 2 . . . e k v k v_0e_1v_1e_2...e_kv_k v0e1v1e2...ekvk为从顶点 v 0 v_0 v0 v k v_k vk的一条道路。其中边 e i e_i ei与顶点 v i − 1 v_{i-1} vi1, v i v_i vi相关联。 v 0 v_0 v0为路的起点, v k v_k vk为路的终点

路长:路所经过的边的条数。即 k k k

:途径边互异的路。

轨道:途经顶点互异的路。

回路:起点和终点重合的路。

:起点和终点重合的轨道。

两顶点间的距离:两顶点间的最短轨道长。

连通:若两顶点间存在路,则称两顶点连通。

连通图:若图的任意两顶点连通,则称该图为连通图。否则称为非连通图。

连通分支:连通图的连通子图

强连通图:若有向图两个顶点 v i , v j v_i,v_j vi,vj间两个方向上都存在路,则称该图为强连通图。

图论表示

边与顶点的关联矩阵

  • 设无向图为 G ( V , E ) G(V,E) G(V,E), V = { v 1 , v 2 , . . . , v n } V=\{v_1,v_2,...,v_n\} V={v1,v2,...,vn}, E = { e 1 , e 2 , . . . , e m } E=\{e_1,e_2,...,e_m\} E={e1,e2,...,em}

则其关联矩阵
M = ( m i j ) n × m m i j = { 1 顶点 v i 与边 e j 关联 0 顶点 v i 与边 e j 不关联 M=(m_{ij})_{n\times m} \\ m_{ij}=\begin{cases} 1&顶点v_i与边e_j关联\\ 0&顶点v_i与边e_j不关联 \end{cases} M=(mij)n×mmij={10顶点vi与边ej关联顶点vi与边ej不关联

  • 设有向图为 D ( V , A ) D(V,A) D(V,A), V = { v 1 , v 2 , . . . , v n } V=\{v_1,v_2,...,v_n\} V={v1,v2,...,vn}, A = { a 1 , a 2 , . . . , a m } A=\{a_1,a_2,...,a_m\} A={a1,a2,...,am}

则其关联矩阵
M = ( m i j ) n × m m i j = { 1 顶点 v i 为弧 a j 的始端 0 顶点 v i 与弧 a j 不关联 − 1 顶点 v i 为弧 a j 的末端 M=(m_{ij})_{n\times m} \\ m_{ij}=\begin{cases} 1&顶点v_i为弧a_j的始端\\ 0&顶点v_i与弧a_j不关联\\ -1&顶点v_i为弧a_j的末端 \end{cases} M=(mij)n×mmij= 101顶点vi为弧aj的始端顶点vi与弧aj不关联顶点vi为弧aj的末端

顶点与顶点的邻接矩阵

  • 设无向非赋权图为 G ( V , E ) G(V,E) G(V,E), V = { v 1 , v 2 , . . . , v n } V=\{v_1,v_2,...,v_n\} V={v1,v2,...,vn}

则其邻接矩阵
W = ( w i j ) n × n w i j = { 1 顶点 v i 与 v j 相邻 0 顶点 v i 与 v j 不相邻或 i = j W=(w_{ij})_{n\times n} \\ w_{ij}=\begin{cases} 1&顶点v_i与v_j相邻\\ 0&顶点v_i与v_j不相邻或i=j \end{cases} W=(wij)n×nwij={10顶点vivj相邻顶点vivj不相邻或i=j

  • 设有向非赋权图为 D ( V , A ) D(V,A) D(V,A), V = { v 1 , v 2 , . . . , v n } V=\{v_1,v_2,...,v_n\} V={v1,v2,...,vn}

则其邻接矩阵
W = ( w i j ) n × n w i j = { 1 弧 ( v i , v j ) ∈ A 0 弧 ( v i , v j ) ∉ A 或 i = j W=(w_{ij})_{n\times n} \\ w_{ij}=\begin{cases} 1&弧(v_i,v_j)\in A\\ 0&弧(v_i,v_j)\notin A或i=j \end{cases} W=(wij)n×nwij={10(vi,vj)A(vi,vj)/Ai=j

比如,下面的有向非赋权图的邻接矩阵为
W = [ 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 ] W= \begin{bmatrix} 0&1&1&0&0&0\\ 0&0&1&0&0&0\\ 0&1&0&0&1&0\\ 0&1&0&0&0&1\\ 0&1&0&1&0&0\\ 0&0&0&0&1&0 \end{bmatrix} W= 000000101110110000000010001001000100
在这里插入图片描述

  • 设无向赋权图为 G ( V , E , W ) G(V,E,W) G(V,E,W), V = { v 1 , v 2 , . . . , v n } V=\{v_1,v_2,...,v_n\} V={v1,v2,...,vn}

则其邻接矩阵
W = ( w i j ) n × n w i j = { w i j 顶点 v i 与 v j 相邻 0 或 ∞ 顶点 v i 与 v j 不相邻或 i = j W=(w_{ij})_{n\times n} \\ w_{ij}=\begin{cases} w_{ij}&顶点v_i与v_j相邻\\ 0或\infty&顶点v_i与v_j不相邻或i=j \end{cases} W=(wij)n×nwij={wij0顶点vivj相邻顶点vivj不相邻或i=j

比如,下面的无向赋权图的邻接矩阵为
W = [ 0 0 10 60 0 0 5 20 10 5 0 1 60 20 1 0 ] W= \begin{bmatrix} 0&0&10&60\\ 0&0&5&20&\\ 10&5&0&1\\ 60&20&1&0 \end{bmatrix} W= 0010600052010501602010
在这里插入图片描述

邻接矩阵的看法或写法为:固定一个顶点(行),看另外的顶点(该行的各列)是否与它相邻,权为多少。

matlab代码

主要函数为

graph() % 创建无向图
disgraph() % 创建有向图
plot() % 绘制图

利用代码创建下图:

在这里插入图片描述

邻接矩阵创建图并显示

% 输入邻接矩阵A
A = [ 0 0 10 60;
    0 0 5 20;
    10 5 0 1;
    60 20 1 0];	
    
% 输入结点名
nodes=["v_1","v_2","v_3","v_4"];

% 使用邻接矩阵A和结点名nodes创建赋权无向图
G = graph(A,nodes);

% plot函数显示图
plot(G,"EdgeLabel",G.Edges.Weight,"NodeFontSize",12);

顶点对创建图并显示

% 输入一个顶点
s = [1 1 2 2 3];

% 输入另一个顶点
t = [3 4 3 4 4];

% 输入结点名
nodes = ["v_1","v_2","v_3","v_4"];

% 输入权值
weights = [10 60 5 20 1];

% 使用顶点对s,t和结点名nodes创建赋权无向图
G = graph(s,t,weights,nodes);

% plot函数显示图
plot(G,"EdgeLabel",G.Edges.Weight,"NodeFontSize",12)

Python代码

用到的库为networkx(简写为nx)

在这里插入图片描述

顶点对创建图并显示

# 导库
import networkx as nx

# 输入边和权
s = [f"$v_{i}$" for i in [1, 1, 2, 2, 3]]
t = [f"$v_{i}$" for i in [3, 4, 3, 4, 4]]
w = [10, 60, 5, 20, 1]
edges = list(zip(s, t, w))

# 创建空图并添加顶点和边权
G = nx.Graph()
G.add_weighted_edges_from(edges)

# 计算顶点位置
pos = nx.spring_layout(G)

# 绘制无权图
nx.draw(G, pos, with_labels=True,font_size=14)

# 追加绘制权
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,font_color="red")

http://www.niftyadmin.cn/n/1445.html

相关文章

Java图片或视频生成GIF动图,发送微信

目录前言GIF简介代码生成图片合成GIF自定义GIF动图视频生成GIF发送微信小结前言 别人的博客文章中有动态显示这是怎么做到的呢?别人的微信发送的表情动态为什么是自己鬼畜视频?这些都是别人做到的,本文就是让自己也可以做到以上的事情&#…

计算机硬件和软件之间的区别

💂 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的 P…

Spark on k8s 在阿里云 EMR 的优化实践

导读: 随着大数据技术的发展,Spark 成为当今大数据领域最受关注的计算引擎之一。在传统的生产环境中,Spark on YARN 成为主流的任务执行方式,而随着容器化概念以及存算分离思想的普及,尤其是 Spark3.1 版本下该模式的正…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---航向控制前言航向控制P控制收敛结果收敛过程PD控制收敛结果收敛过程结果总结前言 无人机(Unmanned Aerial Vehicle),指的是一种由动力驱动的、无线遥控或自主飞行、…

思科dhcp服务器动态获取ip地址

项目要求: 某公司共有网管中心、行政部、技术部、三个部门,分别处在一栋大楼中的两个楼层,为了保证公司内部主机始终能够连接Internet,采用双向冗余设计,分别使用路由器R1与路由器R2连接中国电信和中国联通。 1.首先为了避免不必要…

【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id677017430560 3)全套实验源码手册视频下载地址:http://www.openedv.com/thread-336836-1-1.html 4&#xff…

梯度下降法公式推导+实战--以一元、多元线性回归为例-猛男技术控

梯度下降法 理论部分 梯度 设函数 zf(x,y)zf(x,y)zf(x,y) 在平面区域 DDD内具有一阶连续偏导数,则对于每一点p(x,y)ϵDp\left ( x,y \right )\epsilon Dp(x,y)ϵD,都可定出一个向量 ∂f∂xi→∂f∂yj→\frac{\partial f}{\partial x}\,\,\overrightar…

Golang MQTT的使用 实现发布订阅

Golang MQTT的使用 实现发布订阅 Eclipse Paho MQTT Go Client 为 Eclipse Paho 项目下的 Go 语言版客户端库,该库能够连接到 MQTT Broker 以发布消息,订阅主题并接收已发布的消息,支持完全异步的操作模式。 官方源代码地址: github.com/ec…