图论中一些简单的计算,并用R语言实现。
最短路问题
求连通图任意两点间总权最小的路
Dijkstra算法
对每一个顶点给出一组标号,其中第一位代表从始点到该点最短路权的上界,第二位代表该点的上一个点,第三位是T或P,T表示试探性标号,是一种临时标 号,P表示永久性标号,即这个标号不会改变。标有P的点,其第一位标号即为最短路权。算法的每一步都把某一点的T标号改为P标号,当终点被标上P时,全部计算结束。
以这个图为例,我们要求O到T的最短路:

第一步:
(注意,从O无法一步到达的点,路权标为∞,此时只有A,B,C有路权)

第二步:
比较A,B,C的路权大小,取最小的点A,将T改为P
从A点出发,修改相邻的B,D点的路权

第三步:
发现B的路权小于D,因此将B改为P标号
从B点出发,修改相邻的D,E点的路权
因为从B出发到C的路权为4+1=5,小于从O直接到C的路权,因此C点路权不变,但也改为P标号

第四步:
发现E的路权小于D,因此将E改为P标号
从E点出发,修改相邻的D,T点的路权
D点路权不变(所以第二位不用改),且小于T,改为P标号

第五步:
从D出发,修改相邻T点的路权
T点改为P标号
算法结束

R语言实现
为了将图用编程语言展现,我们需要将图存为邻接矩阵
邻接矩阵中的 a i j a_{ij} aij表示 v i v_i vi到 v j v_j vj的路权,若不能一步到达则记为0,若是自己到自己也记为0
将点O,A,B,C,D,E,T分别记为1,2,3,4,5,6,7
library('igraph')
library('magrittr')
a1 = c(0,2,5,4,rep(0,3))
a2 = c(2,0,2,0,7,0,0)
a3 = c(5,2,0,1,4,3,0)
a4 = c(4,0,1,0,0,4,0)
a5 = c(0,7,4,0,0,1,5)
a6 = c(0,0,3,4,1,0,7)
a7 = c(0,0,0,0,5,7,0)
a = rbind(a1,a2,a3,a4,a5,a6,a7)
g = graph.adjacency(a, mode = c('undirected'), weighted = TRUE) #生成图,无向,数字为权重,否则当作多重边处理
shortest.paths(g,1,7) #1到7的最短路
算出的答案为13,即O到T的最短路
还可以顺便看一下最小生成树。
树是指连通且不含圈的无向图,若图的生成子图是一棵树,则称为该图的生成树,其中具有最小权的生成树称为最小生成树。
minimum.spanning.tree(g) #有权重
minimum.spanning.tree(g, algorithm = 'unweighted') #无权重
最大流与最小割
最大流问题是指在交通运输网络中使运输量最大化,图上的数字代表运输量限制,例如下图

割集的定义
容量网络G=(V,E,C), v s , v t v_s,v_t

本文介绍了图论中的最短路径问题及Dijkstra算法,并通过R语言实现了算法过程。此外,还探讨了最大流与最小割的概念及其在容量网络中的应用。

6597

被折叠的 条评论
为什么被折叠?



