第05讲 图论模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
然后按照边的排列顺序,取定 e1 (v0 , v2 ) , e2 (v2 , v3 ) , e3 (v3 , v4 ) , e4 (v1 , v8 ) ,
e5 (v0 , v1 ) , e6 (v0 , v6 ) , e7 (v5 , v6 ) , 由于下一个未选边中的最小权边 (v0 , v3 ) 与已选边 e1 , e2 构成圈, 所以排除。 选 e8 (v6 , v7 ) 。 得到图 5-4,就是图 G 的一颗最小生成树,它的权是 13。
顶点vi与v j 之间边的权重, (vi , v j ) E wij 0 或) , vi与v j 之间无边时. (
(5-1)
当顶点与顶点之间的关系是对称关系时,对应的图是无向图,除非特殊说明,我们所说 的图都是指无向图。当顶点与顶点之间的关系是非对称关系时,对应的图为有向图。 定义 5.3 有向图 有向图 D 是一个二元组,记为 D (V , A) ,其中 V 为顶点集合, A 为弧(带箭头的边) 的集合。 定义 5.4 赋权有向图 赋权有向图 D 是一个三元组,记为 D (V , A, W ) ,其中 V {v1,, vn } 为顶点集合,
(v0 , v6 ) 2 , (v5 , v6 ) 2 , (v0 , v3 ) 3 , (v6 , v7 ) 3 , (v0 , v4 ) 4 , (v0 , v5 ) 4 , (v0 , v8 ) 4 , (v1 , v2 ) 4 , (v0 , v7 ) 5 , (v7 , v8 ) 5 , (v4 , v5 ) 5
A 为弧(带箭头的边)的集合, W (wij )nn 为邻接矩阵,其中
顶点vi v j的弧的权重, 当vi v j 有弧时 wij 0 或) , 当vi v j 无弧时. (
当 G (或 D )为非赋权图时,也可以看成赋权图,邻接矩阵
(5-2)
1, 当vi与v j间有边(弧)时, wij 0, 当vi与v j间无边(弧)时.
3
v1
4 2 4 5 3
v2
1 3 4 4 2
v3
v1
1
v8
1
v0
1
v4
1
v8
v7
2
v2 1
v0
1
v3 1 v4 v5
5
Βιβλιοθήκη Baidu7
2 v6
5
v5
2 3
v6 (b)
2
图 5-3 连通图及对应的最小生成树 解 这就是一个最小生成树问题,用 Kruskal 算法求解。先将边按大小顺序由小至大排 列: (v0 , v2 ) 1 , (v2 , v3 ) 1 , (v3 , v4 ) 1 , (v1 , v8 ) 1 , (v0 , v1 ) 2 ,
5.3 最小生成树 5.3.1 prim 算法构造最小生成树 构造连通赋权图 G (V , E, W ) 的最小生成树,设置两个集合 P 和 Q ,其中 P 用于存放
G 的最小生成树中的顶点,集合 Q 存放 G 的最小生成树中的边。令集合 P 的初值为 ,集合 Q 的初值为 Q (空集) 。prim P {v1}(假设构造最小生成树时,从顶点 v1 出发) 算法的思想是,从所有 p P , v V P 的边中,选取具有最小权值的边 pv ,将顶点 v 加 入集合 P 中, 将边 pv 加入集合 Q 中, 如此不断重复, 直到 P V 时, 最小生成树构造完毕, 这时集合 Q 中包含了最小生成树的所有边。
1
例 5.1 图 5-1 所示的图,其邻接矩阵为
v5
0 9 A 2 4 7
9 2 4 7 0 3 4 0 3 0 8 4 4 8 0 6 0 5 6 0
6 7
v1
4 4 2 8 3
v3
v4
9
v2
4
图 5-1 赋权无向图 用 Matlab 重新画出图 5-1。 clc, clear a=zeros(5); %邻接矩阵初始化 a(1,[2:5])=[9 2 4 7]; a(2,[3 4])=[3 4]; %输入邻接矩阵的上三角元素 a(3,[4 5])=[8 4]; a(4,5)=6; a=a'; b=sparse(a) %变成下三角矩阵,并转化为稀疏矩阵 h=biograph(b,[],'ShowWeights','on','ShowArrows','off') %生成图形对象 %Matlab2014B 和 2015A,'ShowWeights'有 bug,属性值为'off'时没有问题, 属性值为'on'时出错, 但图形显示是正确的 set(h,'LayoutType','equilibrium'); %设置属性:图形的布局是平衡的 view(h) %显示图形 例 5.2 图 5-2 所表示的有向图的邻接矩阵
v1
4 2 4 5 3
v2
1 3 4 4 2
v3
v1
1
v8
1
v0
1
v4
1
v8
v7
2
v2 1
v0
1
v3 1 v4 v5
5
v7
2 v6 (a)
5
v5
2 3
v6
2
图 5-4 生成的最小生成树
求最小生成树的 Kruskal 算法的 Matlab 程序如下(用 Matlab 计算时,顶点 v0 , v1 ,, v8 分别编号为 1,2,,9 ) : clc, clear a=zeros(9); a(1,[2:9])=[2 1 3 4 4 2 5 4]; a(2,[3 9])=[4 1]; a(3,4)=1; a(4,5)=1; a(5,6)=5; a(6,7)=2; a(7,8)=3; a(8,9)=5; a=a'; %转成 Matlab 需要的下三角元素 a=sparse(a); %转换为稀疏矩阵 b=graphminspantree(a,'Method','Kruskal') %注意要写 Kruskal 算法,否则使用 Prim 算法 L=sum(sum(b)) %求最小生成树的权重 view(biograph(b,[],'ShowArrows','off','ShowWeights','on')) %画最小生成树, %Matlab2014B 和 2015A,'ShowWeights'有 bug,属性值为'off'时没有问题,属性值为'on'时 出错,但图形显示是正确的 5.4 最短路算法 求最短路的算法有 Dijkstra 标号算法和 Floyd 算法等方法。 Dijkstra 标号算法只适用于权 重是非负的情形。 5.4.1 Dijkstra 算法 给定赋权图 G (V , E,W ) ,其中 V {v1 ,, vn } 为顶点集合, E 为边的集合,邻接 矩阵 W ( wij ) nn ,求顶点 u0 到 v0 的最短距离 d (u0 , v0 ) 。记 l (vi ) 表示顶点 vi 的标号值。 Dijkstra 标号算法的计算步骤如下:
2
5.2 Matlab 图论工具箱的命令
Matlab 图论工具箱的命令见表 5-1。
表 5-1 命令名 graphallshortestpaths graphconncomp graphisdag graphisomorphism graphisspantree graphmaxflow graphminspantree graphpred2path graphshortestpath graphtopoorder graphtraverse Matlab 图论工具箱的相关命令 功能 求图中所有顶点对之间的最短距离 找无向图的连通分支,或有向图的强(弱)连通分支 测试有向图是否含有圈,不含圈返回 1,否则返回 0 确定两个图是否同构,同构返回 1,否则返回 0 确定一个图是否是生成树,是返回 1,否则返回 0 计算有向图的最大流 求图的最小生成树 把前驱顶点序列变成路径的顶点序列 求图中指定的一对顶点间的最短距离和最短路径 执行有向无圈图的拓扑排序 求从一顶点出发,所能遍历图中的顶点
第5讲
图论模型
司守奎 烟台市,海军航空工程学院数学教研室 Email:sishoukui@163.com 5.1 图与网络的数据结构 5.1.1 图的概念 定义 5.1 非赋权图 一个非赋权图是由点集 V {vi } 和 V 中元素的无序对的一个集合 E {ek } 所构成的二 元组,记为 G (V , E ) , V 中的元素 v i 叫做顶点, E 中的元素 e k 叫做边。 定义 5.2 赋权图 赋权图(网络) G 是一个三元组,记为 G (V , E, W ) ,其中 V {v1,, vn } 为顶点集 合, E 为边的集合, W ( wij )nn 为邻接矩阵(或权重矩阵) ,其中
(5-3)
5.1.2 Matlab 中邻接矩阵的表示 在 Matlab 中邻接矩阵以稀疏矩阵的格式存储。 在数学上,稀疏矩阵是指矩阵中零元素很多,非零元素很少的矩阵。对于计算机的数 据结构,稀疏矩阵只是一种存储格式,只存放非零元素的行地址、列地址和非零元素本身的 值,即按如下方式存储 (非零元素的行地址,非零元素的列地址) ,非零元素的值。 在 Matlab 中无向图和有向图邻接矩阵的使用上有很大差异。 对于有向图,只要写出邻接矩阵,直接使用 Matlab 的 sparse 命令,就可以把邻接矩阵 转化为稀疏矩阵的表示方式,供 Matlab 工具箱使用。 对于无向图, 由于邻接矩阵是对称阵, Matlab 中只使用邻接矩阵的下三角元素, 即 Matlab 把截取的邻接矩阵的下三角矩阵,用 sparse 命令转化为稀疏矩阵。 在 Matlab 中,普通矩阵使用 sparse 命令变成稀疏矩阵,稀疏矩阵使用 full 命令变成普 通矩阵。 另外要注意,在数学上按照邻接矩阵的定义式(5-1) ,如果两个顶点间无边连接,对应 的元素为 0 或 。在 Matlab 工具箱中,由于使用稀疏矩阵,隐含着两个顶点间无边连接时, 邻接矩阵的对应元素为 0。 5.1.3 例题
prim 算法如下: (1) P {v1} , Q ; (2)while P ~ V 找最小边 pv ,其中 p P, v V P ;
P P {v} ; Q Q { pv} ;
end 5.3.2 Kruskal 算法构造最小生成树 科茹斯克尔(Kruskal)算法是一个好算法。Kruskal 算法如下: (1)选 e1 E ,使得 e1 是权值最小的边。 (2)若 e1 , e2 ,, ei 已选好,则从 E {e1, e2 ,, ei } 中选取 ei 1 ,使得 i) {e1, e2 , , ei , ei 1} 中无圈,且 ii) ei 1 是 E {e1, e2 ,, ei } 中权值最小的边。 (3)直到选得 e|V |1 为止。 5.3.2 最小生成树举例 例 5.3 一个乡有 9 个自然村,其间道路及各道路长度如图 5-3 所示,各边上的数字表 示距离,问架设通讯线时,如何拉线才能使用线最短。
0 0 0 A 0 0 0
1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0
v2 v4
v1
v6
v3
v5
图 5-2 用 Matlab 重新画出图 5-2。 clc, clear a=zeros(6); a(1,[2 3])=1; a(2,3)=1; a(3,[2 5])=1; a(4,[2 6])=1; a(5,[2 4 6])=1; a(6,5)=1; b=sparse(a); h=biograph(b,[],'ShowArrows','on') %生成图形对象 set(h,'LayoutType','equilibrium'); %设置属性:图形的布局是平衡的 view(h) %显示图形
相关文档
最新文档