图论(3)--图论工具箱及应用
Matlab图论工具箱介绍
命令列表
| 命令名 | 功能 |
|---|---|
| graphallshortestpaths | 求图中所有顶点对之间的最短距离 |
| graphconncomp | 找无向图的连通分支,或有向图的强弱连通分支 |
| graphisdag | 测试有向图是否含有圈,不含圈返回1,否则返回0 |
| graphisomorphism | 确定两个图是否同构,同构返回1,否则返回0 |
| graphisspantree | 确定一个图是否是生成树,是返回1,否则返回0 |
| graphmaxflow | 计算有向图的最大流 |
| graphminspantree | 在图中找最小生成树 |
| graphpred2path | 把前驱顶点序列变成路径的顶点序列 |
| graphshortestpath | 求图中指定的一对顶点间的最短距离和最短路径 |
| graphtopootder | 执行有向无圈图的拓扑排序 |
| graphtraverse | 求从一顶点出发,所能遍历图中的顶点 |
graphallshortestpaths函数
Matlab使用方法
① 根据题目构造权值向量;
② 匹配线段的起始点与相应的权值;
③ 调用函数graphallshortestpaths
函数格式
[dist]=graphallshortestpaths(G)
[dist]=graphallshortestpaths(G,...’Directed’,DirectedValue,...)
[dist]=graphallshortestpaths(G,...’Weights’,WeightsValue,...)
DirectedValue属性
| 属性 | 作用 |
|---|---|
| True | 有向图(默认) |
| False | 无向图 |
WeightsValue属性
Weightvalue属性一般不用指定,函数graphallshortestpath函数默认从稀疏矩阵G中获取。
graphshortestpaths函数
函数调用格式
[dist,path]=graphshortestpaths(G,S,T)
[dist,path]=graphshortestpaths(G,S,T’Directed’,DirectedValue,...)
[dist,path]=graphshortestpaths(G,S,T’Weights’,WeightsValue,...)
函数参数说明
| G | 稀疏矩阵 |
|---|---|
| S | 起点 |
| T | 终点 |
| Dist | 最短距离 |
| path | 最短距离经过的路径节点 |
最小生成树graphminspantree函数
函数调用格式
[Tree,pred]=graphminspantree(G)
[Tree,pred]=graphminspantree(G,R)
[Tree,pred]=graphminspantree(...,’Method’,MethofValue,...)
[Tree,pred]=graphminspantree(...,’Weights’,WeightsValue,...)
参数说明
该函数用来寻找一个无循环的节点集合,连接无向图的全部节点,并且总的权值最小。
| Tree | 一个代表生成树的稀疏矩阵 |
|---|---|
| Pred | 包含最小生成的祖先节点的向量 |
| G | 稀疏矩阵 |
| R | 根节点,取值为1到节点数目 |
| Method | 可以选择‘Kruskal’,’Prim’等算法 |
图的遍历graphtraverse函数
函数调用格式
[disc,pred,closed]=graphtraverse(G,S)
[...]=graphtraverse(G,S,...’Directed’,DirectedValue,...)
[...]=graphtraverse(G,S,...’Depth’,DepthValue,...)
[...]=graphtraverse(G,S,...’Method’,MethodValue,...)
参数说明
| G | 有向图的稀疏矩阵 |
|---|---|
| S | 起始节点 |
| Disc | 节点索引向量 |
| Pred | 祖先节点索引向量 |
Methodvalue表示遍历方法:默认为“深度优先遍历”(DFS和DPS后面会介绍)
返回稀疏矩阵adjacency
函数调用格式
A = adjacency(G)
A = adjacency(G,'weighted')
A = adjacency(G,weights)
A = adjacency(G)返回图 G 的稀疏邻接矩阵。
A = adjacency(G,'weighted') 返回加权邻接矩阵,其中对于每条边 (i,j),值 A(i,j)包含边的权重。
A = adjacency(G,weights)返回加权邻接矩阵,其边权重由向量 weights指定。
具体链接请查看matlab手册:图邻接矩阵 - MATLAB adjacency - MathWorks 中国
利用图论工具箱解决最大流,最小费用最大流问题
最大流问题
问题描述

graphmaxflow函数
注意:该工具箱函数权值必须为正,且两个顶点不能有两条弧。我们可以在权值最小的那条边中间插入新的顶点,再将其依次连接,新边的权值均与原来的权值相等。
函数调用格式
[MaxFlow,FlowMatrix,Cut]=graphmaxflow(G,SNode,TNode)
[...]=graphmaxflow(G,SNode,TNode,...’Capacity’,CapacityValue,...)
[...]=graphmaxflow(G,SNode,TNode,...’Method’,MethodValue,...)
函数参数说明
| G | N*N的稀疏矩阵 |
|---|---|
| SNode | 起点 |
| TNcode | 目标点 |
| CapacityValue属性 | 每条边自定义容量的列向量,默认从G中获取 |
| MethodValue属性 | 可以取‘Edmonds’和‘Goldberg’算法 |
| 输出参数MaxFlow | 网络最大流 |
| 输出参数FlowMatrix | 每条边数据流的值所组成的稀疏矩阵 |
| 输出参数cut | 连接起点与目标点的逻辑向量,如果有多个解时,Cut是一个矩阵 |
关于Sparse函数
详见:https://www.cnblogs.com/Demo1589/p/7881762.html
最小费用最大流问题
问题描述

解决步骤:
- Matlab求出最大流
- Lingo代码解决
具体实现
视频:https://www.bilibili.com/video/BV1sf4y157ZG
这部分就是简单的调用函数,非常简单~

浙公网安备 33010602011771号