minimum spanning trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 ·...
TRANSCRIPT
อลกอรทมบนกราฟอลกอรทมบนกราฟ
Graph Graph AlgorithmsAlgorithms Minimum Spanning Treesp g
Kruskal's algorithm Prim's algorithm Prim s algorithm
Single-Source Shortest Paths Dijkstra's algorithm Bellman-Ford 's algorithm
All-Pair Shortest Paths Floyd Warshall's algorithm Floyd-Warshall s algorithm Johnson's algorithm
Minimum Spanning TreesMinimum Spanning Trees Inputp
กราฟ G = (V,E) เสนเชอมมนาหนก ไมตองมทศ เสนเชอมมนาหนก ไมตองมทศ
Output
Spanning Tree
เสนเชอมตาง ๆ (เปนตนไม) ทตอถงทกปม มผลรวมของนาหนกเสนเชอมตาสด
–2
3
MinimumSpanning Tree
23
24
311
ตวอยางตวอยาง
สรางเขาวงกตดวย สรางเขาวงกตดวย MSTMST สรางเขาวงกตดวย สรางเขาวงกตดวย MSTMST
Prim's AlgorithmPrim's Algorithm Prim's Algorithm : MinPrim's Algorithm : Min--HeapHeap
1012
10
914
10
121315
Prim is "greedy"เลอกเสนสนสดทตอกบตนไมทกาลงโตกบตนไมทกาลงโต
Prim's Algorithm : MinPrim's Algorithm : Min--HeapHeap
1012
10
14
10
121315
Prim is "greedy"เลอกเสนสนสดทตอกบตนไมทกาลงโตกบตนไมทกาลงโต
Prim's Algorithm : MinPrim's Algorithm : Min--HeapHeap
1012
10
14
10
645
Prim is "greedy"เลอกเสนสนสดทตอกบตนไมทกาลงโตกบตนไมทกาลงโต
ตวอยางตวอยาง : Prim: Prim
32
3
5
714
223
3 13 1
Prim's AlgorithmPrim's AlgorithmPrim( G=(V,E) ) {for each vertex v in V {d[v] = ; p[v] = null inMST[v] = false
}}select an arbitrary vertex v and let's d[v] = 0H = a min heap of all vertices ordered by d[]
while( H ≠ ) {u = H.removeMin()inMST[u] = true ใช binary heapinMST[u] truefor each v adj(u) {
if( !inMST[v] AND w(u,v) < d[v] ) {ใช binary heap
d[v] = w(u,v); H.decreaseKey(v)p[v] = u
}}}
}O( l )
dense graph e = (v2)
O( 2 l )return p;}
O(e log v) O(v2 log v)
Prim's AlgorithmPrim's AlgorithmPrim( G=(V,E) ) {for each vertex v in V {
G[1..n][1..n] ) {for ( v = 1; v <= n; v++ ) {
d[v] = ; p[v] = null inMST[v] = false
}}select an arbitrary vertex v and let's d[v] = 0H = a min heap of all vertices ordered by d[]
while( H ≠ ) {u = H.removeMin()inMST[u] = true
for ( i = 1; i <= n; i++) { u = minIndex( d ) (n); d[u] = inMST[u] truefor each v adj(u) {
if( !inMST[v] AND w(u,v) < d[v] ) {for ( v = 1; v <= n; i++ ) {
G[u][v]d[v] = w(u,v); H.decreaseKey(v)p[v] = u
}G[u][v];
}}
}ใช adjacency matrix
( 2)( 2)return p;}
(v2)(n2)
Kruskal'sKruskal's AlgorithmAlgorithm
ตรวจวาเกดวงอยางไร (เรว ๆ)ตรวจวาเกดวงอยางไร (เรว ๆ)
Kruskal is "greedy" เลอกเสนสนสดทเชอมตนไม สองตนทตางกนในปาสองตนทตางกนในปา
Kruskal'sKruskal's AlgorithmAlgorithm
Kruskal is "greedy" เลอกเสนสนสดทเชอมตนไม สองตนทตางกนในปาสองตนทตางกนในปา
Kruskal's AlgorithmKruskal's AlgorithmKrusal( G=(V,E) ) {for each v in V create a set {v}for each v in V create a set {v}H = a min heap of all edges ordered by weightsp g y gT = an empty listwhile ( T.size() < |V|-1 ) {
(u v) H removeMin()(u,v) = H.removeMin()if ( findSet(u) findSet(v) ) {
T.add( (u,v) )unionSet( findSet(u), findSet(v) )
}}}return T
}
แทนเซตดวยตนไมแทนเซตดวยตนไม
{ 1 2 3 4 11}{ 1, 2, 3, 4,11}
11
2
11
2 3
11
1
43 11
1
4
311
1 1 3 1
2 42 4
แบบใดกได อยในตนเดยวกน เปนเซตเดยวกน
แทนกลมเซตดวยปาไมแทนกลมเซตดวยปาไม
{11 1 2 3 4 } { 5 7 } { 6 8 9 } { 10 }{11,1, 2, 3, 4 }, { 5, 7 }, { 6, 8, 9 }, { 10 }
11
2
43
7
5 8
6
9
1011
1
43 5 8 9
กลมเซตไมมสวนรวม
(Disjoint Sets)
ขอใชกลมเซตทสมาชกเปนจานวนเตม 1, 2, ..., n
findSetfindSet และและ unionSetunionSet
ใหรากแทนหมายเลขเซต findSet(1) ได 2
2 7
ใหรากแทนหมายเลขเซต findSet(1) ได 2
findSet(3) ได 2
11 43 5 ...
findSet(5) ได 71 findSet(5) ได 7
findSet(7) ได 7unionSet(2, 7)
2 7
11
2
43 7 2
7
5
1
43 7
5 11 43
1
การแทน การแทน Disjoint SetsDisjoint Sets
{ 11 1 2 3 4 } { 5 7 } { 6 8 9 } { 10 }{ 11, 1, 2, 3, 4 }, { 5, 7 }, { 6, 8, 9 }, { 10 }
11
2
43
7
5 8
6
9
10
11
1
43 5 8 9
1 2 3 4 5 6 7 8 9 10 11P 11 2 2 2 7 6 7 6 6 10 2
P[k] คอหมายเลขพอของ k
Disjoint Sets : Disjoint Sets : findSetfindSet2 7 6 10
11
1
43 5 8 9
11 2 3 4 5 6 7 8 9 10 1111 2 2 2 7 6 7 6 6 10 2P
findSet( e ) {findSet( e ) {
11 2 2 2 7 6 7 6 6 10 2PfindSet( e ) {if ( P[e] == e )
return efindSet( e ) {while( P[e] e ) {
e = P[e]else
return findSet(P[e])}
}return e
} }}ใชเวลาแปรตามความสงของตนไม
Disjoint Sets : Disjoint Sets : unionSetunionSet2 7 6 10
11
1
43 5 8 9
11 2 3 4 5 6 7 8 9 10 1111 2 2 2 7 6 7 6 6 10 2P
unionSet(2 7) unionSet(7 2)
11 2 2 2 7 6 7 6 6 10 2P
unionSet( s, t ) {P[t] = s;
unionSet(2, 7)
2 7
unionSet(7, 2)
} 11 43 7
11
2 5
1 5 11
1
43ตองการตนไมเตย 1ทาให findSet เรว
Disjoint Sets : Disjoint Sets : unionSetunionSet2 7 6 10
11
1
43 5 8 9
11 2 3 4 5 6 7 8 9 10 1111 2 2 2 7 6 7 6 6 10 2P 11 2 2 2 7 6 7 6 6 10 2P
2 1 1 0HunionSet( s, t ) {if ( H[s] > H[t] ) {( [ ] [ ] ) {
P[t] = s;} else {
P[ ] tO(1)
P[s] = t;if (H[s] == H[t]) H[t]++;
} ตนเตยเปนลกของ}} รากของตนสง
unionSetunionSet ใหตนไมสงสด ๆใหตนไมสงสด ๆ
unionSetunionSet ใหตนไมสงสด ๆใหตนไมสงสด ๆ 1 = C(4, 0)
4
6
( , )
= C(4, 1)
C(4 2)6
4
= C(4, 2)
= C(4, 3)
1
16 24
= C(4, 4)
unionSet จนขอมล n ตวอยในหนงเซตn
nknC 2)(
16 = 24
จะไดตนไมสงสด สง log2 nk
knC 2),(0
สรป :unionSet O(1)
findSet O(log n)findSet O(log n)
Kruskal's AlgorithmKruskal's AlgorithmKrusal( G=(V,E) ) {D a new group of disjoint setsD = a new group of disjoint setsfor each v in V
D.createNewSet(v)H = a min heap of all edges ordered by weightsT = an empty listwhile ( T size() < |V| 1 ) {while ( T.size() < |V|-1 ) {
(u,v) = H.removeMin()if ( D.findSet(u) D.findSet(v) ) {( ( ) ( ) ) {
T.add( (u,v) )D.unionSet( D.findSet(u), D.findSet(v) )
}}}return T
O(e log e)
simple graphs : e = O(v2)} O(e log v)
simple graphs : e = O(v2)
เลอกสนสดนาไปส เลอกสนสดนาไปส MSTMST
Awe1
V - Awe0
V AwA wV-AV A
ใหตนดาเปน MSTดงนน wA + we1 + wV A ตาสดดงนน wA + we1 + wV-A ตาสดให we0 we1ลบ e1 เพม e0ลบ e1, เพม e0ได spanning tree ใหมทม w w ของ MST
0 ใ MSTแสดงวา e0 อยใน MST
วถสนสดจากแหลงตนทางเดยววถสนสดจากแหลงตนทางเดยว ให G เปนกราฟระบทศทาง เสนเชอมมความยาว ตองการหาวถส นสดจากปม s ใน G ไปยงปมอน ๆ สงทได : Shortest-path tree สงทได : Shortest-path tree
p[s] = null, d[s] = 0
8 5
s0
p[u] = s, d[u] = 5
8 5
10 uคาเตอน 8 5 p[ ] , [ ]
2 3
18 16
uShortest Path Tree ไมใช Minimum
8 5
8
[ ] d[ ] 21
1812 30
16Spanning Tree
8
p[v] = u, d[v] = 2114
4 26
v20 21
22
เสนตง เสนตง + + คลายเสนคลายเสนd[u] เกบความยาวของวถส นสดเทาทรจาก s ไป u
s
ส ( ) ง2
เสน (u,v) ตง (u,v) is tense10u v
15
พจารณาเสนเชอม (u,v) พบวา d[u] + w(u,v) < d[v]( ) ( )
แสดงวา พบวถใหมผาน (u,v) ไป v ทสนกวาของเดมทเปน d[v]
ดงนนเปลยน d[v] = d[u] + w(u,v) และเปลยน p[v] = u
คลายเสน (u v)คลายเสน (u,v)relax (u,v)
แนวคดของ แนวคดของ Dijkstra'sDijkstra's AlgorithmAlgorithm
ss
3 4Shortest path tree
3 4 21
5 4
568
113
92 3
10
8 9
97 3 3
5
15
8
2 9
ขยาย Shortest path tree
pโดยเลอกปมทม d[] ตาสด
DijkstraDijkstra Algorithm : Algorithm : ตวอยางตวอยาง
3 2
1
0 5
108 7
12
4
7
6 30
s
อลกอรทมของ อลกอรทมของ DijkstraDijkstraDijkstra( G=(V,E), s) {f h V { O(e log v)for each v V {d[v] = ; p[v] = null;
}
( g )
d[s] = 0H = a min heap of all vertices ordered by d[] hil (H ) {while (H ) {u = H.removeMin()for each v Adj(u) { ส ( ) j( ) {
if ( d[u]+w(u,v) < d[v] ) {d[v] = d[u] + w(u,v); H.decreaseKey(v)p[v] u
ถา เสน (u,v) ตง
l ( )p[v] = u }
}relax (u,v)
}return d
}แตละปมถกนาออกจากฮปหนงครง
เสนเชอมแตละเสนถกคลายอยางมากหนงครง}
DijkstraDijkstra คลาย คลาย PrimPrimPrim( G=(V,E) ) {for each v in V {
Dijkstra( G=(V,E), s ) {
d[v] = ; p[v] = null inMST[v] = false
}}select an arbitrary vertex v and let's d[v] = 0H = a min heap of all vertices ordered by d[]
while( H ≠ ) {u = H.removeMin()inMST[u] = trueinMST[u] truefor each v adj(u) {
if( !inMST[v] AND w(u,v) < d[v] ) {d[u]+
d[v] = w(u,v); H.decreaseKey(v)p[v] = u
}d[u]+
}}
}return p;
}
ถาม ถาม negativenegative--weight edgesweight edges
ss
910
19 6 9
9
619 66
+2
–17 –2
ถาม ถาม negativenegative--weight edgesweight edges
44 – 7
1
3 52
0
3 5
ss
Dijkstra's algorithm อาจใหคาตอบผดอาจใหคาตอบผด
ถาม ถาม negativenegative--weight edgesweight edges
– 1
3 52
0
3 5
ss
Dijkstra's algorithm อาจใหคาตอบถกอาจใหคาตอบถก
ลองคดดลองคดดDijkstra( G=(V,E), s) {for each v V {
ModifiedDijkstra( G=(V,E), s ) {อลกอรทมนรองรบเสนเชอมd[v] = ; p[v] = null;
}d[s] = 0
อลกอรทมนรองรบเสนเชอมความยาวลบไดหรอไม ?
d[s] 0H = a min heap of all vertices ordered by d[]
H = an empty min heap; H.add(s)while (H ) {
u = H.removeMin()for each v Adj(u) { มขอเสยอะไร ?for each v Adj(u) {
if ( d[u]+w(u,v) < d[v] ) {d[v] = d[u] + w(u,v); H.decreaseKey(v)p[v] = u
} H.add(v)เพมปมปลายเสนเชอม}
}}
เพมปมปลายเสนเชอมทเคยตง ใหกบ heap
return d}
ModifiedDijkstraModifiedDijkstra
44 – 7
1
3 52
0
3 5
ss
ไมขอเสยอะไร ?
NegativeNegative--Weight Weight CyclesCycles
2 2 4s 2 2 4
1– 2 = 2 + 1 – 2 = 11– 2 = 2 + 1 2 = 1
2 4negative-weight
s 2 2 4 cycle
1– 4 = 2 + 1 – 4 = –1
หาวถสนสดไมได เพราะมนสนลงเรอย ๆ เมอหมนในวง
อลกอรทมของ อลกอรทมของ BellmanBellman--FordFord ใชไดกบ negative-weight edge จะแจงใหทราบ ถาม negative-weight cycle ใช dynamic programming ใช dynamic programming วถส นสดจาก s ไป t
ตองไมผานปมซา มเสนเชอมในวถอยางมาก |V| – 1 เสน มเสนเชอมในวถอยางมาก |V| 1 เสน
ให d(i, v) แทนความยาวของวถส นสดจาก s ไป vทมเสนเชอมอยางมาก i เสนทมเสนเชอมอยางมาก i เสน
d(i – 1, v)s
uใชอยางมาก i – 1 เสน
v
d(i, v) = min ( , )
min { d(i – 1, u) + w(u, v) }uAdj(v)uAdj(v)
d(?, s ) = 0, d(0, v) = ตองการ d( |V|– 1, v )
อลกอรทมของ อลกอรทมของ BellmanBellman--FordFord
d (v) = mindi – 1(v)
BellmanFord(G (V E) s) {
di(v) min min { di – 1(u) + w(u, v) }
uAdj(v)BellmanFord(G=(V,E), s) {for each v V {d[v] = ; p[v] = null;[ ] p[ ]
}d[s] = 0for (i 1 i<|V| i++) {
(|V|)
for (i=1; i<|V|; i++) {for each v V
for each u Adj(v) for each edge (u,v) in E(|E|)
j( )if ( d[u]+w(u,v) < d[v] ) {d[v] = d[u] + w(u,v)p[ ]p[v] = u;
}} (ve)}return d
}(ve)
BellmanBellman--Ford : Ford : ตวอยางตวอยาง
d
–8 2
d
1
0 5ce
0 5
–3–3 a
84
–1bf
6 30 ss
s a b c d e fs, a, b, c, d, e, f
ม ม negativenegative--weight cycleweight cycle ?? relax เสนตงทกเสนเปนจานวน |V|-1 รอบ
ตรวจสอบเสนเชอมทกเสนอกรอบ ถายงมเสนตง ม negative-weight cycle
BellmanFord( G=(V,E), s ) {for each v V {
g g y
d[v] = ; p[v] = null;}d[s] = 0d[s] = 0for (i=1; i<|V|; i++)for each edge (u,v) E
if ( d[u]+w(u,v) < d[v] ) {d[v] = d[u] + w(u,v); p[v] = u;
}}for each edge (u,v) E
if ( d[u]+w(u,v) < d[v] ) return nullreturn d;
}
วถสนสดของทกคปมในกราฟวถสนสดของทกคปมในกราฟ กราฟ G (V, E) เสนเชอมมนาหนก มทศทาง( , )
เสนเชอมยาวเปนลบได แตตองไมมวงทความยาวรวมเปนลบ
4 2
24
แตตองไมมวงทความยาวรวมเปนลบ1 3
27
1 shortest path tree ของวถสน
2
-4-2shortest path tree ของวถสนสดจากปม 2 ถงปมอน ๆ
1 2 3 41 3 4 1P 1 2 3 4
1 0 2 6 2D 1 2 3 4
1 0 7 2W
1 - 3 4 12 2 - 4 1
1 0 2 6 22 -2 0 4 0
1 0 - 7 22 -2 0 - 1
3 2 3 - 14 2 3 4 -
3 -6 -4 0 -44 -2 0 4 0
3 - -4 0 24 - - 4 0
การหาวถสนสดของทกคปมการหาวถสนสดของทกคปม หา single-source shortest paths ของทกปมg p
เรยก Dijkstra v ครง (ความยาวเสนเชอมหามเปนลบ)binary heap + adj list : O(v . e log v )binary heap + adj. list : O(v e log v )linear array + adj. matrix : O(v . v 2) = O(v 3) B ll F d ( ส ช ป ไ ) เรยก Bellman-Ford v ครง (เสนเชอมยาวเปนลบได)O(v 2e ) ซงเปน O(v 4) สาหรบ dense graph
ใชกาหนดการพลวต ตรงไปตรงมา : (v 4) ตรงไปตรงมา : (v ) repeated squaring : (v 3 log v ) Flo d Wa shall ( 3) Floyd-Warshall : (v 3)
นยามความยาวของวถสนสดนยามความยาวของวถสนสด Single-source
ให dm (j) แทนความยาวของวถสนสดจาก s ไป jทมเสนเชอมอยางมาก m เสน
All-pairใ d ( ) ไป ให dm (i, j) แทนความยาวของวถสนสดจาก i ไป jทมเสนเชอมอยางมาก m เสน
ขอเปลยนเปน dm (i, j) เปน di, j (m)
คาตอบใหญไดจากคาตอบยอยคาตอบใหญไดจากคาตอบยอย ให di,j(m) แทนความยาวของวถส นสดจาก i ไป j
i,j
ทใชเสนเชอมไมเกน m เสน1
2 w1,j
i j
3
i j. . .
v
d (m) = min { d k(m–1) + wk }di,j(m) min { di,k(m 1) + wk,j }1 k v
d (0) 0 d (0) d (1) 0di,i(0) = 0, di,j(0) = , di,j(1) = wi,j , wi,i = 0
การคานวณความยาวของวถสนสดการคานวณความยาวของวถสนสด วถส นสดยอมไมผานปมซา ถา G ม v ปม, วถส นสดของปมคใด ๆ ตองใชเสนเชอมไมเกน v – 1 เสนเชอมไมเกน v – 1 เสน
4 2
24
ความยาวของวถสนสดจาก i ไป j ทใชเสน
1 3
27
1
จาก i ไป j ทใชเสนเชอมไมเกน m เสน
ใ D( ) d ( )2
-4-21
ให D(m) คอเมตรกซทเกบ dij(m) D(1) = W (W คอ adjacency matrix ของ G)
เร มท D(1) คานวณหา D(2), D(3), ..., D(v – 1)d (m) = min { d (m 1) + w }d (m) = min { d (m 1) + w }d (m) = min { d (m 1) + w }di,j(m) = min { di,k(m–1) + wk,j }di,j(m) = min { di,k(m–1) + wk,j }
1 k v 1 k v di,j(m) = min { di,k(m–1) + wk,j }
1 k v
แบบชาแบบชาAPSP_Slow( W[1..v][1..v] ) {D[1] = W (v4)D[1] = Wfor(m = 2; m < v; m++)
D[m] = ExtendShortestPath( D[m-1], W );
(v )
return D[v-1];} หา D(2), D(3), ..., D(v – 1)
ExtendShortestPath( d[1..v][1..v], W[1..v][1..v] ) {for (i = 1; i <= v; i++) {
for (j = 1; j <= v; j++) {dm[i][j] = ;for (k = 1 to v) {for (k = 1 to v) {
dm[i][j] = min( dm[i][j], d[i][k] + W[k][j]);}
}}return dm; di,j(m) = min { di,k(m–1) + wk,j }di,j(m) = min { di,k(m–1) + wk,j }di,j(m) = min { di,k(m–1) + wk,j }return dm;
}i,j i,k k,ji,j i,k k,j
1 k v 1 k v 1 k v
ปรบปรงใหเรวขนปรบปรงใหเรวขน แบบชา : D(m) หาจาก D(m-1) กบ D(1)
i jk
ใชไมเกน m – 1 เสน
แบบเรว : D(m) หาจาก D(m/2) กบ D(m/2)
i jD(m – 1) D(1) แบบเรว : D(m) หาจาก D(m/2) กบ D(m/2)
ใชไมเกน m/2 เสน ใชไมเกน m/2 เสน
i jkD(m/2) D(m/2)
เร ม D(1) หา D(2), D(4), D(8), ... (เรวกวา) กราฟไมมวงลบ D(v 1)=D(v)=D(v+1)= กราฟไมมวงลบ, D(v-1)=D(v)=D(v+1)=... ตองการ D(v-1) กหา D(2k) 2k v-1
เชน ตองการ D(13) กหา D(16), ตองการ D(57) กหา D(64)
แบบกาลงสองซาแบบกาลงสองซาAPSP_RepeatedSquare( W[1..v][1..v] ) { (v3 log v)D[1] = W; m = 1;while (m < v-1) {
(v log v)
while (m < v 1) {D[2*m] = ExtendShortestPath( D[m], D[m]);m = 2*m;
}return D[m];
}2c v-1c log2(v-1)} c log2(v 1)c = log2(v-1)
iใชไมเกน m เสน
( ) jใชไมเกน m เสน
ikD(m) jD(m)
i jใชไมเกน 2m เสน
i jD(2m)
อลกอรทมของ อลกอรทมของ FloydFloyd--WarshallWarshall เปลยนแนวคดการเขยน recurrence ให di,j(k) แทนความยาวของวถส นสดจากปม i ไป j ทสามารถใชจดใน {1 2 3 k}จากปม i ไป j ทสามารถใชจดใน {1,2,3,...,k} เปนปมระหวางทางdi,j(0) คอ wi,j (ไมมปมระหวางทาง)
ตองการ d (v) v = จานวนปม (สามารถใชไดทกปม) ตองการ di,j(v) , v = จานวนปม (สามารถใชไดทกปม)
1 2 k – 1
ki j. . .1 k 1
kdi j(k) = min( di j(k – 1), di k(k – 1) + dk j (k – 1) )i.j( ) ( i,j( ), i,k( ) k,j ( ) )di,j(0) = wi,j
อลกอรทมของ อลกอรทมของ FloydFloyd--WarshallWarshallFloydWarshall( W[1..v][1..v] ) { ใหใชปม {1,2,...,k}
D = Wfor (k = 1; k <= v; k++) {
for (i = 1; i <= v; i++) {เปนปมระหวางทาง
for (i = 1; i <= v; i++) {for (j = 1; j <= v; j++) {
D[i][j] = min( D[i][j], D[i][k] + D[k][j] );
}}}
}return D; (v3)} (v )
d (k) i ( d (k 1) d (k 1) d (k 1) )di. j(k) = min( di,j(k – 1), di,k(k – 1) + dk,j (k – 1) )di j(0) = wi ji, j( ) i, j
การหาวถสนสดของทกคปมการหาวถสนสดของทกคปม ใชกาหนดการพลวต
ตรงไปตรงมา : (v 4) repeated squaring : (v 3 log v ) repeated squaring : (v log v ) Floyd-Warshall : (v 3) J h อลกอรทมของ Johnson O(v . e log v ) ดสาหรบ sparse graph
อลกอรทมของ อลกอรทมของ JohnsonJohnson ใช Dijkstra หา single-source shortest path ของทกปม linear array : O(v . v 2) = O(v 3)y ( ) ( ) binary heap : O(v . e log v )
แต Dijkstra ไมรบ negative weight edges แต Dijkstra ไมรบ negative-weight edges ดงน น
เปลยน G ใหเปนกราฟใหม K ทไมมเสนเชอมตดลบ(โดยวถสนสดของ G ตองเหมอนวถสนสดของ K)( )
แลวใช Dijkstra จานวน v ครงเพอหาวถสนสดของทกคปม
การปรบความยาวเสนเชอมการปรบความยาวเสนเชอม1 –3 1 4 0 4
ใหทกเสนยาวอก +3
14
4 0 47
w*i,j = wi,j + h(i) – h(j)
1 + 9 – 7 = 3h( )
9 7 3 01 –3 1 3 1 4
1 –3 14
3 0 113
7 5 2 41 3 14
3 0 –17
ความยาวใหมของวถความยาวใหมของวถai b j ai b j
wi,a wa,b wb,j w*i,a w*a,b w*b,j
w*i,a = wi,a + h(i) – h(a)
w* = w + h(a) h(b)w*a,b = wa,b + h(a) – h(b)
w*b j = wb j + h(b) – h(j)b,j b,j ( ) (j)
w*i a+ w*a b+ w*b j = wi a+ wb j+ wa b +i,a a,b b,j i,a b,j a,b
h(i) – h(a) + h(a) – h(b) + h(b) – h(j)
w*(i a b j) = w(i a b j) + h(i) h(j)
= wi,a+ wb,j+ wa,b + h(i) – h(j)w*(i a b j) = w(i a b j) + h(i) – h(j)
hh((ii)) มคาเทาไรกได วถสนสดไมเปลยนมคาเทาไรกได วถสนสดไมเปลยน พจารณาปม i กบ j
(( ))
ai b jj วถใด ๆ ของปมคน ถงแมผานปมตางกน
ai b j
cง งแตมปมปลายเหมอนกน
ความยาวใหมของวถใด ๆ ของปมคน เพมเปนปรมาณเทากน ความยาวใหมของวถใด ๆ ของปมคน เพมเปนปรมาณเทากน
w*(i a b j) = w(i a b j) + h(i) – h(j)
ดงน นวถส นสด (หลงปรบความยาว) ไมเปลยน
w*(i c j) = w(i c j) + h(i) – h(j)
ดงนนวถสนสด (หลงปรบความยาว) ไมเปลยน ความยาวของวงในกราฟกไมเปลยน
w*(d e f d) = w(d e f d) + h(d) – h(d)
วธหา วธหา hh((ii)) ททาใหไมมเสนเชอมตดลบททาใหไมมเสนเชอมตดลบ เตมปม s และเสนเชอมยาว 0 จาก s ถงทกปม
(( ))
หาวถส นสดจาก s ถงทกปม (ใช Bellman-Ford)ใ h(i) ส ส ไป i ให h(i) = ความยาวของวถสนสดจาก s ไป i
ดเสนเชอม (i, j) จะไดวา h(i) + wi j h(j) ดเสนเชอม (i, j) จะไดวา h(i) wi,j h(j) ดงน น w*i,j = wi,j + h(i) – h(j) 0s s
0 0 0 0s s
1 –3 14
0 0 –3 –2 ij4
1 0 0
j
6
อลกอรทมของ อลกอรทมของ JohnsonJohnsonJohnson( G ) {create K : K V = G V {s}create K : K.V = G.V {s}
: K.E = G.E {(s,i) | i G.V)}: K.w = G.w, K.w(s,i) = 0, i K.V)
h = BellmanFord(K, s)if (h == null) return "Negative Cycle"else {
(ve)
else {for each edge (i,j) G.E
G.w(i,j) += h[i] – h[j]for each vertex i G.V {
d = Dijkstra(G, i)for each vertex j G V
O(e log v)for each vertex j G.V
D[i][j] = d[j] – (h[i] – h[j])}return D
}}
ถา Dijkstra ใช binary heap จะทาใหJohnson ใชเวลา O(ve log v ) ซงดกวา
ใ} FloydWarshall เมอใชกบ sparse graph