minimum spanning trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 ·...

15
อัลกอริทึมบนกราฟ อัลกอริทึมบนกราฟ Graph Graph Algorithms Algorithms Minimum Spanning Trees 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 Trees Minimum Spanning Trees Input กราฟ G = (V,E) เส นเช อมมาหนก ไมองม เสนเชอมมนาหนก ไมตองมทศ Output Spanning Tree เส นเช อมต่าง (เป นต้นไม ) ที ต่อถึงทุกปม มีผลรวมของนํ้าหนักเส นเช อมตํ ่าสุด –2 3 Minimum Spanning Tree 2 3 2 4 3 1 1 ตัวอย่าง ตัวอย่าง

Upload: others

Post on 12-Feb-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

อลกอรทมบนกราฟอลกอรทมบนกราฟ

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

ตวอยางตวอยาง

Page 2: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

สรางเขาวงกตดวย สรางเขาวงกตดวย MSTMST สรางเขาวงกตดวย สรางเขาวงกตดวย MSTMST

Prim's AlgorithmPrim's Algorithm Prim's Algorithm : MinPrim's Algorithm : Min--HeapHeap

1012

10

914

10

121315

Prim is "greedy"เลอกเสนสนสดทตอกบตนไมทกาลงโตกบตนไมทกาลงโต

Page 3: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

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)

Page 4: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

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

}

Page 5: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

แทนเซตดวยตนไมแทนเซตดวยตนไม

{ 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

Page 6: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

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 ใหตนไมสงสด ๆใหตนไมสงสด ๆ

Page 7: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

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

Page 8: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

เสนตง เสนตง + + คลายเสนคลายเสน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

}แตละปมถกนาออกจากฮปหนงครง

เสนเชอมแตละเสนถกคลายอยางมากหนงครง}

Page 9: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

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 อาจใหคาตอบถกอาจใหคาตอบถก

Page 10: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

ลองคดดลองคดด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 )

Page 11: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

อลกอรทมของ อลกอรทมของ 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

Page 12: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

การหาวถสนสดของทกคปมการหาวถสนสดของทกคปม หา 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

Page 13: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

แบบชาแบบชา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

Page 14: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

อลกอรทมของ อลกอรทมของ 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

Page 15: Minimum Spanning Trees ตัวอย่างsomchai/2110327/2553/07... · 2010-08-10 · กลุ่มเซตไม ม่ีส่วนร่วม (Disjoint Sets) ขอใชกลุ้่มเซตท

ความยาวใหมของวถความยาวใหมของวถ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