数学建模社区-数学中国
标题:
常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
[打印本页]
作者:
浅夏110
时间:
2020-5-20 09:49
标题:
常用模型&算法总结—图&网络模型应用—树:连通性、最小生成树
1 基本概念
+ s* Z! c! f2 \" a- Y
连通的无圈图叫做树,记之为T 。若图G 满足V(G) =V(T ) , E(T ) ⊂ E(G) , 则称T 是G 的生成树。图G 连通的充分必要条件为G 有生成树。一个连通图的生成树 的个数很多,用τ (G) 表示G 的生成树的个数,则有公式
, W5 G' G5 J' }4 ]# v: |, n
$ q4 n) ~' m" b/ Q; _
- j8 U" a/ h/ D, n) T
树有下面常用的五个充要条件。
8 B* o3 W8 Y3 k( N# k
0 E/ u& M0 c0 s. U4 @
定理 1 (i)G 是树当且仅当G 中任二顶点之间有且仅有一条轨道。
: Q- j, w# P; a1 a5 m4 q
2 n( T! r4 R! c H9 i- r% m% f* W) c( y- L
(ii)G 是树当且仅当G 无圈,且ε =ν −1。
3 q0 ^+ g* m$ h+ a2 h2 D0 t9 ^
( _0 M/ X8 P5 T
(iii)G 是树当且仅当G 连通,且ε =ν −1。
3 Q: Q: `# R) @ p
5 c) w; T3 {% T' A7 p) ~
(iv)G 是树当且仅当G 连通,且∀e∈ E(G) ,G − e 不连通。
/ p @. X' k8 j2 R
6 [% b* `( a$ h3 @+ h& D
(v)G 是树当且仅当G 无圈,∀e∉ E(G) ,G + e 恰有一个圈。
4 v+ c. x2 t! [- m, }$ w' m
: v. z# P5 D+ p9 L
2 应用—连线问题
& W* y$ | F7 I5 Z, S6 _
欲修筑连接 n 个城市的铁路,已知i 城与 j 城之间的铁路造价为Cij ,设计一个线 路图,使总造价最低。
$ a% q1 ^& V d: F2 }3 u; X2 Z
# H4 ?. i* S" ?' y% t
连线问题的数学模型是在连通赋权图上求权最小的生成树。赋权图的具最小权的生 成树叫做最小生成树。
4 c+ |% a; H6 p0 v
( }. S8 X; Z- [
下面介绍构造最小生成树的两种常用算法。
; R# k4 n, e- n- @
! K1 r Y% e: h3 s( B) v
2.1 prim 算法构造最小生成树
% e# p/ M" @4 J/ ]7 H
设置两个集合 P 和Q ,其中 P 用于存放G 的最小生成树中的顶点,集合Q 存放G的最小生成树中的边。令集合 P 的初值为 { P = v1 }(假设构造最小生成树时,从顶点 v1 出发),集合Q 的初值为Q = Φ 。
" e1 ?2 y" T. Q; R0 N' T. F7 Y; a
4 D0 i* @. ?$ O! ]
prim 算法的思想是,从所有 p ∈ P ,v ∈V − P 的边 中,选取具有最小权值的边 pv ,将顶点 v 加入集合 P 中,将边 pv 加入集合Q 中,如 此不断重复,直到 P =V 时,最小生成树构造完毕,这时集合Q 中包含了最小生成树 的所有边。
* t% a0 x0 o$ a4 }3 @/ z% }
0 o4 G' R, [4 O8 q2 V1 v
* D0 r# D" c0 _1 p4 u) |2 C7 j
5 h& N" p, v: N, C
例 13 用 prim 算法求图 5 的最小生成树。 我们用 的第一、二、三行分别表示生成树边的起点、终点、权集合。Matlab 程序如下:
5 H( W! Y7 ?' h
' J: \9 M, X" G$ ^1 B9 N# ?
# ?- H* E: E4 Q9 y2 h7 {
clc;clear;
' u% i0 Y6 ]( I0 o" m
a=zeros(7);
+ o) R3 R5 j* |* l6 [0 b
a(1,2)=50; a(1,3)=60;
' w z1 ]5 T2 a; W8 A
a(2,4)=65; a(2,5)=40;
$ | r, h" `7 p k8 w4 [0 O7 t
a(3,4)=52;a(3,7)=45;
% v+ a1 @. N h4 G! j
a(4,5)=50; a(4,6)=30;a(4,7)=42;
9 t) a: \- _0 p7 k9 L: L0 I
a(5,6)=70;
' ^; P* D8 u2 t6 j4 r
a=a+a';a(find(a==0))=inf;
' e5 Y. n6 E: i2 a. U
result=[];p=1;tb=2:length(a);
. `! b! P8 _# J( O& z: G: p9 ^/ {2 `
while length(result)~=length(a)-1
- o5 P' w1 P" u! Y7 j2 G7 `
temp=a(p,tb);temp=temp(
;
: t& _7 Y9 U, N0 Q( \( Y2 m# |7 {
d=min(temp);
' B7 u2 S+ N' f5 V' g
[jb,kb]=find(a(p,tb)==d);
0 {* Z$ A7 B9 G2 y, I
j=p(jb(1));k=tb(kb(1));
& u7 ^" v% m* p4 Y
result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
' D" g v ]. U: m; f5 `. H0 Y
end
( _1 x2 U& s [( L4 F( e
result
' ?1 f% Q" E8 k- @ |% o- `
5 W$ f5 J; e/ L* x5 H/ @# }
2.1 Kruskal 算法构造最小生成树
, l% ~" `1 S3 `! \
科茹斯克尔(Kruskal)算法是一个好算法。Kruskal 算法如下:
9 v7 x2 q$ J+ d7 D
9 ?* _' v/ u6 w0 u' ^
* }: c* P: ]$ O! H. C7 K
u# L0 f+ ~9 z. x2 D
例 14 用 Kruskal 算法构造例 3 的最小生成树。 我们用 存放各边端点的信息,当选中某一边之后,就将此边对应的顶点序 号中较大序号u 改记为此边的另一序号v ,同时把后面边中所有序号为u 的改记为v 。
- d" b+ v; G0 n$ G
* U3 ^$ S0 M7 {2 Z
此方法的几何意义是:将序号u 的这个顶点收缩到v 顶点,u 顶点不复存在。后面继续 寻查时,发现某边的两个顶点序号相同时,认为已被收缩掉,失去了被选取的资格。 Matlab 程序如下:
; Z0 Y* s* ?- N, I* W7 d, M
" l9 n; O6 X% E+ X8 N
clc;clear;
: A0 p5 m' k8 j& p# W" i0 p
a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40;
8 }7 R* L1 i- [# F- g6 y
a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;
3 g# @4 ]% ^9 t3 P$ {: C
a(4,7)=42; a(5,6)=70;
9 q( D9 t: |0 P
[i,j,b]=find(a);
5 G% M5 M, h8 Q
data=[i';j';b'];index=data(1:2,
;
- J0 [4 w$ `) a
loop=max(size(a))-1;
0 n. s6 Q) b8 V+ x& S- I$ |
result=[];
- J. T; V0 T ?: \" Y1 C
while length(result)<loop
' k/ {) q, _1 v2 R B. \0 q
temp=min(data(3,
);
- ?2 H0 u$ `1 i; h% l3 S
flag=find(data(3,
==temp);
& m. w8 V N8 N1 B
flag=flag(1);
% h' ^8 ?$ I5 n6 t
v1=data(1,flag);v2=data(2,flag);
0 G% d& \- S* B! b. B
if index(1,flag)~=index(2,flag)
" }" _5 S( L! f" O x5 U
result=[result,data(:,flag)];
, Z2 _6 e% L+ Q A1 F
end
, Z" q% m* H3 K7 \- Q4 h' p) V
index(find(index==v2))=v1;
, D4 a! {3 A j" p
data(:,flag)=[];
5 x& v3 u; m4 Q: q$ _/ i
index(:,flag)=[];
( b1 D7 p& Y" F/ u1 d
end
$ D2 h/ x5 v9 {( U5 h1 d3 l# e
result
& C6 |- r8 `4 P! I* E
& A" d/ [: C% V
9 u$ o9 m2 ], f& \5 Y: l0 b
1 q- g4 W7 x# w( m
————————————————
3 q8 u Z; I( V: o' x
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- J1 R5 J4 d% P. P* P f; `
原文链接:https://blog.csdn.net/qq_29831163/article/details/89785681
( f7 H( E" A+ x% a9 l
$ U/ o5 b* M- K) M( k1 u5 l: ~
u9 U7 G) N0 C8 l- U2 C3 V
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5