1 两个指定顶点之间的最短路径: f) g% D' m+ A; t
问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间, 找一条最短铁路线。5 V6 Q6 l% O: u0 H7 e. E" L : K/ e' f; @5 |( S
$ |+ n! p! V; h% j; W: a
( u# D) M' D/ n% _+ RDijkstra算法 5 s' f8 j; C; K; u# u4 W0 v 4 h+ A% u1 b' G! k" i# r 0 ]( @' B1 t0 n例1 某公司在六个城市 中有分公司,从 到 的直接航程票价记在如下矩阵的 位置上。 (∞表示无直接航路),请帮助该公司设计一张城市 到其它城市间的票价便宜的路线图。 9 D" i( w& k3 E F: C, e q
' @$ M1 @+ j- @+ J# H* ]* b# v% z9 c ! p# O+ }" M, k$ Z/ R& B + \7 r1 y6 q D- I解 用矩阵 (n为顶点个数)存放各边权的邻接矩阵,行向量 分别用来存放P 标号信息、标号顶点顺序、标号顶点索引、短通路的值。其中分量3 Y4 R ~) X1 C0 u g . @6 {9 q- I0 X6 F8 e
: ?+ i5 F# T, t9 @, D
& M2 O4 | [! V9 |5 K
求第一个城市到其它城市的短路径的 Matlab 程序如下: 8 E9 `- ^- q: f0 P# I; h
5 Q! o1 S+ @- U7 r6 Dclc,clear/ r. ]" M5 @5 l8 ?, o3 T
a=zeros(6);; b3 r( {; \" s1 c1 `- j) \
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10; 0 I$ C& u/ _' i8 y$ n! P& r3 L6 ~a(2,3)=15;a(2,4)=20;a(2,6)=25;' l1 H; {& J$ G/ L. E/ q- S
a(3,4)=10;a(3,5)=20;/ w5 P5 s5 ~, x+ p8 y) y2 T4 L
a(4,5)=10;a(4,6)=25; 6 n9 m2 Z6 m P* n1 B9 Ca(5,6)=55;/ k) ^) t# Z- C5 a# H* `
a=a+a'; 7 |: M; @( S5 P# g& ta(find(a==0))=inf;$ d0 y. d6 H5 v S
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a)); {/ x; V) U# F: h% u- t6 U
d(1:length(a))=inf;d(1)=0;temp=1;( c* l$ @+ [! d S
while sum(pb)<length(a) 0 L0 o' ^% }/ Y( Q) d$ I0 K! y tb=find(pb==0); % U2 @. ^+ J' g- Z$ D+ |9 y4 f d(tb)=min(d(tb),d(temp)+a(temp,tb)); ) @, @) ?5 W N* ^, `7 W tmpb=find(d(tb)==min(d(tb))); - t [* D+ v) ?1 e+ x! t9 F temp=tb(tmpb(1));7 K' x: |9 T3 ^3 ^& w
pb(temp)=1;5 V4 q* ]8 X; O3 q2 f+ Y* a4 O( x
index1=[index1,temp]; 5 g3 c9 d) ~; R temp2=find(d(index1)==d(temp)-a(temp,index1));$ `/ M( u. P, n/ j: E4 E' \5 \
index2(temp)=index1(temp2(1)); 4 k- j! ]% u o) Z3 Nend* K+ Y& ~9 A0 q& E" c( r7 b/ e! x
d, index1, index2 ) m5 \: }6 Q* {* b7 z$ J( |/ G/ G3 x& t& H6 o 2 两个指定顶点之间最短路问题的数学表达式 9 h0 b( F$ t- D& G% y$ m$ v- G " w2 j2 V* h0 T 0 i! R p7 ?$ O; S; t例 2 最小价格管道铺设方案 2 H" Y7 F9 [5 D# [* M在图 3 中,用点表示城市,现有 A, B1, B2 ,C1,C2 ,C3 , D 共 7 个城市。点与 点之间的连线表示城市间有道路相连。连线旁的数字表示道路的长度。现计划从城市 A 到城市 D 铺设一条天然气管道,请设计出最小价格管道铺设方案。 - j+ a- S' `% r- M/ t0 k! \, U+ u' U; {* o q% D- ~9 h/ U % [! L8 p: q2 d& h
! |+ }0 `+ k. O+ k f/ t# V i( r编写 LINGO 程序如下:4 _4 |- C3 h$ |, X. c) Y, q
$ |, {! ]4 R/ q) x) d/ K' \. N
model:5 f% V% N# H& W. v
sets:/ E* U0 y; z! z" s
cities/A,B1,B2,C1,C2,C3,D/;9 |2 I+ H) J' l9 A: C, e
roads(cities,cities)/A B1,A B2,B1 C1,B1 C2,B1 C3,B2 C1,7 U" a9 n) e2 c3 X% s
B2 C2,B2 C3,C1 D,C2 D,C3 D/:w,x; y: y* k+ x% }7 \% P) m
endsets0 q' f& U3 Z: e, e( [1 F: ?
data: , k# B% G0 Y* f* N5 N( `w=2 4 3 3 1 2 3 1 1 3 4; 8 u# q$ L# b/ c+ Qenddata% \6 z9 ~' |' L. Z5 y3 u+ C
n=@size(cities); !城市的个数; ( U9 D: d; n6 z) H( E# X0 o0 ^) Tmin=@sum(roads:w*x); ) K: K& K8 `! L) ~4 l@for(cities(i)|i #ne#1 #and# i #ne#n:/ o0 R. F3 I$ D; n# R, _
@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i))); # T- T \# a( u; t* p1 ^3 Q* f& @ @sum(roads(i,j)|i #eq#1:x(i,j))=1; 1 @: c- W; u4 u# T& T$ K9 H: h @sum(roads(i,j)|j #eq#n:x(i,j))=1;' m. h; y3 o" ?- }# Q
end ! \$ G+ F' c$ q9 P' C2 ^0 P
' x" T0 \* s& [, x8 n2 @5 B 例3 (无向图的最短路问题)