กราฟเบื้องต้นsomchai/2110327/... ·...

37
กราฟเบื้องต้น นิยาม ตัวอย่างการใช กราฟ กราฟประเภทต่าง วิถีและวง การแทนกราฟ การแวะผ่าน สภาพการเช อมโยงของกราฟ หัวข้อ กราฟ (Graph) A D C B edge vertex B A C D Königsberg Bridge Problem 1736: Leonhard Euler ใช้กราฟแทน ... + - article adj. adj. noun verb noun a b c z d e s

Upload: others

Post on 29-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

กราฟเบองตน

นยามตวอยางการใชกราฟกราฟประเภทตาง ๆ

วถและวงการแทนกราฟการแวะผาน

สภาพการเชอมโยงของกราฟ

หวขอ

กราฟ (Graph)

A

D

C

B

edge

vertex

B

A

C

D

Königsberg Bridge Problem

1736: Leonhard Euler

ใชกราฟแทน ...

+ -

article adj. adj. noun verbnoun

a b c

z

d e s

Page 2: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

ใชกราฟแทน ...

/3

/3

2

2

2

1

0 2

4

8

/3

/3 2

2

16

/3

/3

/3 2

10

5

a

b

c

d

e

กขคง

\

2110211 2110200

handout quiz java quiz Math4

w1.doc q1.txt q2.txt Demo.java q1.doc GF

gf.nb coef.nb

กราฟกบการออกแบบวงจรรวม

กราฟกบวงจรดจตอล กราฟกบการออกแบบวงจร

A

B

C

D

VDDX

X

GND

BA

DC

ABCD

C

A B

D

AB C

VDD

GND

D

X

X = (A+B)•(C+D)

Page 3: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

กราฟกบการเชอมสายสญญาณ กราฟประเภทตาง ๆ A

B

C

D

A

B

C

D

undirectedgraph

directedgraph

A

B

C

D

21 3

5

9–1 2

A

B

C

D

21 3

5

9–1 2

weightedgraph

self-loopparallel edges

simple graph ไมม self-loop และ parallele edges

Complete Graphs

complete graph ทม v vertices ม v(v – 1)/2 edges

simple graph : e = O( v2 )

Connected Graphs

กราฟตอถงกนม 1 component

2 components

กราฟตอถงกนทม v ปม มเสนเชอมอยางนอย v – 1 เสน

connected graphe = ( v )

Page 4: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Path (วถ) & Cycle (วง)

Simple path หรอ simple cycle คอวถหรอวงทผานปมละอยางมากหนงครง

ใหปมแทนเมอง มถนนจากทกเมองไปทกเมองพนกงานขายตองเดนทางแวะผานทกเมองอยางไร ใหมการเดนทางทส นสดโดยไมผานเมองซา

Traveling Salesperson Problem

กราฟตอถงกนทไมมวง กราฟทม v ปม ม v-1 เสน และไมมวง กราฟตอถงกนทม v ปม ม v-1 เสน กราฟทม simple path เพยงวถระหวางปมทกค

Trees : ตนไมคอ...

1 2 3 4 5

1 0 1 0 1 0

2 1 0 1 1 1

3 0 1 0 1 1

4 1 1 1 0 0

5 0 1 1 0 0

adjacency matrix

adjacency list

การแทนกราฟ

2 5

4

3

11

2

3

4

5

< 2,4 >

< 1,3,4,5 >

< 2,4,5 >

< 1,2,3 >

< 2,3 >

Page 5: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

1 2 3 4 5

1 0 1 0 1 0

2 1 0 1 1 1

3 0 1 0 1 1

4 1 1 1 0 0

5 0 1 1 0 0

adjacency matrix

adjacency list

คาถามทพบบอยของกราฟ

1

2

3

4

5

< 2,4 >

< 1,3,4,5 >

< 2,4,5 >

< 1,2,3 >

< 2,3 >

(1)

O(v)O(v)

(v)

มเสนเชอมตอระหวางปม a กบ b หรอไม ?

ปม a มเสนเชอมตอกบปมใดบาง ?

adjacency matrix

adjacency list

กราฟระบทศทาง (Directed Graph)

2 5

4

3

11

2

3

4

5

< 2,4 >

< 3,5 >

< 4,5 >

< 2 >

< >

1 2 3 4 5

1 0 1 0 1 0

2 0 0 1 0 1

3 0 0 0 1 1

4 0 1 0 0 0

5 0 0 0 0 0

adjacency matrix

adjacency list

กราฟถวงนาหนก (Weighted Graph)

1

2

3

4

5

< (2,5),(4,21) >

< (3,5),(5,20) >

< (4,13),(5,-8) >

< (2,9) >

< >

1 2 3 4 5

1 0 5 0 21 0

2 0 0 5 0 20

3 0 0 0 13 -8

4 0 9 0 0 0

5 0 0 0 0 0

2 5

4

3

1

20

-8

13

5

9

21

5

Breadth-First Search Depth-First Search Topological Sort Strongly Connected Components

Basic Graph Algorithms

Page 6: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

การคนตนไมBreadth-first

searchDepth-first

search

A

B F

D E G

I K

C

H J

A

B F

D E G

I K

C

H J

การคนกราฟBreadth-first

searchDepth-first

search

A

B F

D E G

I K

C

H J

A

B F

D E G

I K

C

H J

ใช queue จาปมระหวางการคน

ใช stack จาปมระหวางการคน

Breadth-First Search

A

B F

D E G

I K

C

1

2 3

7

8 9

4

5 6

bfs(G=(V,E), s) {for each v V

color[v] WHITE;Q an empty queue;Q.enqueue(s);color[s] GRAYwhile ( Q ≠ ) {

u Q.dequeue();color[u] BLACK;for each v adj(u)

if (color[v]==WHITE){Q.enqueue(v);color[v] GRAY

}}

}

A

A

A

( |V|+ |E| )

ถาใช adjacency list

BFS Tree : Path Finding

0

1

1

2

2

2

3

3

3

3

4

4

4

4

5

5

5

6

6

d[u] คอจานวนเสนเชอมจากจดเรมตนถง u

Page 7: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

BFS : Path Findingbfs(G=(V,E), s, t) {

for each v Vcolor[v] WHITE;

Q an empty queue;Q.enqueue(s);color[s] GRAYwhile ( Q ≠ ) {

u Q.dequeue();color[v] BLACK;for each v adj(u)

if ( color[v] == WHITE ){color[v] GRAYQ.enqueue(v);

}}

}

d[v] ;

d[v] d[u] + 1;

p[v] null;

p[v] u;

d[s] 0;

d[v] ==

BFS : Shortest Path

*

0 1

1

2

2 3

3

4

4

5 6

6

7

7

8

8

8

9

9

9

910 10

10

10

11

BFS : Shortest Path

*

ใช BFS หา Shortest Path

1

11 1

111 1 1

1111

11 1

11

11

1 1

1

11 1

11

1 11

11

113

33 3

333 3 3

3333

33 3

33

33

3 3

333 3

33

3 33

33

33

1

11 1

1

1

1 1

1

1 1

BFS BFS

BFSBFS

หาวถสนสดได ถาเสนเชอมทกเสนยาวเทากน

3 2

1

2

1

1

ไมควรทาแบบน มวธอนทดกวา

Page 8: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Word Ladder

ปง

ลง

ปลก

ปากปลง

หากราก

หาง หลง

ฮกลกสก

หกรก

ปก

รก ปก ปลก ปลง หลงตองการการเปลยนทสนสด : ใช BFS

Depth-First Search

A

B F

D E G

I K

C

1

2 6

8

4 9

7

3 5

dfs(G=(V,E), s) {color[] WHITES an empty stack color[s]GRAYS.push(s);while ( S ≠ ) {

u S.top()choose v adj(u) AND

color[v] is WHITEif ( v does not exist ) {

u S.pop()color[u]BLACK

} else {color[v]GRAY S.push(v)

}}

}

A

A

A

Depth-First Search

a

b dc

dfs(G=(V,E), u) {color[u] GRAYfor each v adj(u)

if (color[v] == WHITE) dfs(G, v)

color[u] BLACK}

dfs(G, a)

dfs(G, b) dfs(G, c) dfs(G, d)

Depth-First Search

a

b dcdfs(G, b)

dfs(G, a)

dfs(G,c)

dfs(G=(V,E), u) {color[u] GRAYfor each v adj(u)

if (color[v] == WHITE) dfs(G, v)

color[u] BLACK}

Page 9: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

DFS(G, u) : ไมจาเปนตองผานทกปม

A

B

F

D E

G

I

K

C

dfs(G=(V,E), u) {color[u] GRAYfor each v adj(u)

if (color[v] == WHITE) dfs(G, v)

color[u] BLACK}

dfs( G, A )

DFS( G ) : ผานทกปมdfs(G=(V,E), u) {

color[u] GRAYfor each v adj(u)

if (color[v] == WHITE) dfs(G, v)

color[u] BLACK}

dfs( G=(V,E) ) {for each v V

color[v] WHITE for each v V

if (color[v] == WHITE) dfs(G, v)

}

A

B

F

D E

G

I

K

C

dfs( G )

dfs(G=(V,E), u)color[u] GRAY; for each v adj(u)

if (color[v] == WHITE)

dfs(G, v)color[u] BLACK

}

DFS Treesdfs( G=(V,E) )

for each v Vcolor[v] WHITE

for each v Vif (color[v] == WHITE)

dfs(G, v)}

p[v] nullp[v] u

ได DFS tree สองตน

A

B

F

D E

G

I

K

C

Topological Sort

หา topological sort ไดเฉพาะกบ

Directed Acyclic Graph (DAG)

F G K A C B D I E

ลาดบของปมทไมมเสนเชอมชจากปมหลงมายงปมกอนหนา

A

B

F

D E

G

I

K

C

Page 10: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

DAG : Directed Acyclic Graph

ปมเทา คอปมทยงแวะผานลกหลานไมครบ

ดงนนถาพบปมเทา แสดงวา พบปมทเปน

บรรพบรรษ

ม cycle ไมใช DAG

isDAG : DFSdfs( G=(V,E) ) {

for each v V)color[v] WHITE

for each v V)if (color[v] == WHITE)

dfs(G, v)

}dfs(G=(V,E), u) {

color[u] GRAY for each v adj(u)

if (color[v] == WHITE)dfs( G, v )

color[u] BLACK

}

if ( !isDAG(G, v) ) return false

return true

isDAG( G=(V,E) ) {

isDAG( G=(V,E), u ) {

if (color[v] == GRAY) return false

if ( !isDAG(G, v) ) return false

return true

Applications

Programming Discrete Math.

Digital Logic

Data Structure

Algorithm

Comp. Organization

Comp. Architecture

OperatingSystem

Artificial Intelligence

Prog. Methodology

Software Architecture

Design Pattern

Instruction schedulingหนาทของ compiler ในการจดลาดบการทางานของคาสง

เพอเพมประสทธภาพการทางานใน pipeline

Applications

r1 r0 + 4

r2 r0 + 2

r3 r1 + 2

r4 r1 + r2

1

4

2

3

1 2 3 4 2 1 3 4

2 1 4 31 2 4 3

Page 11: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Spreadsheetลาดบการคานวณสตรในเซลลตาง ๆ เมอขอมลมการเปลยนแปลง

Applications

21

49

15

=A1*2

=A2*2

=A3*2

=SUM(B1:B3)

=B1*2

=B2*2

=SUM(C2:C3)

=B2 + C2

=B3 + C3

=B4 + C4

A1

A2

A3

B1

B2

B3

C2

C3

D2

D3

D4B4 C4

DFS : เวลาเขา-เวลาออกdfs(G=(V,E), u) {

color[u] GRAY

for each v adj(u)if (color[v] == WHITE)

dfs(G, v)color[u] BLACK

}

A

B

F

D E

G

I

K

C

1

2 10 14

4

15

13

35

dfs( G=(V,E) ) {for each v V

color[v] WHITE

for each v Vif (color[v] == WHITE)

dfs(G, v)}

time 0d[u] ++time;

f[u] ++time;

/6

/7

/8

/9/11

/12/18

/17

/16

Topological Sort : DFS

A

B

F

D E

G

I

K

C

1

2 10 14

4

15

13

35/6

/7

/8

/9/11

/12/18

/17

/16

ทา DFS ลาดบปมจากซายไปขวา

จะเรยงตาม f จากมากไปนอย

F G K A C B D I E18 17 16 11 9 8 7 612

(u, v) : f(u) > f(v)

u v

u v

dfs(G, v) ตองเสรจกอนdfs(G, u) จะเสรจได

f[v] ++timef[u] ++time

f[v] ถกใสคามากอนแลวf[u] ++time

u v

ไมเกด เพราะเปน DAG

Page 12: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Topological Sort : DFS

dfs(G=(V,E), u) {color[u] GRAYd[u] ++timefor each v adj(u)

if (color[v] == WHITE) dfs(G, v)

color[u] BLACK;f[u] ++time

}

dfs( G=(V,E) ) {for each v V(G)

color[v] WHITE time 0for each v V(G)

if (color[v] == WHITE) dfs(G, v);

}

S an empty stack

push(S, u)return S

A

B

F

D E

G

I

K

C

1

210 14

4

15

13

35/6

/7

/8

/9/11

/12/18

/17

/16

• topological sort คอลาดบของปม เรยงตาม f จากมากไปนอย

• ใช stack จา ปมทไปหาลก ๆ เสรจแลว

• เมอ finish ก push ลง stack

• DFS เสรจ : topological sort คอ ลาดบของปมท pop ไดจาก stack

tsort( G = (V,E) ) { tsort( G=(V,E), u ) {

tsort( G, v)tsort( G, v)

Topological Sort : KahnA

B

F

D E

G

I

K

C

A F

B

F

D E

G

I

K

C

F

B

F

D E

G

I

K

C

F

D

F

E

G

I

K

C

F

I

F

E

G

K

C

F

E

G

K

C G

E K

C

K

E

CC

EE

Undirected Graph : Connectivity

กราฟตอถงกนม 1 component

2 components

DFS ( G )

จานวน components เทากบจานวน DFS treesปมในแตละ DFS tree กคอปมใน component เดยวกน

Directed Graph : Connectivity

digraph ทแปลงเปนแบบไมคดทศ แลวเปนกราฟตอถงกน

Page 13: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Directed Graph : Connectivity

กราฟทม path ระหวางทก ๆ คปม ทงไปและกลบ

กราฟยอยใหญสด ๆ ท strongly connected

A B

Digraph = DAG ของ SCC

DFS(G, v) : nodes ทไปถงไดจาก v หา SCC : DFS(G, v)ทา DFS เรมท node ในกลมปลายทางกอน

แลวคอยถอยมา DFS ทกลมตนทาง

กลมปลายทางอยไหน ?

หา topological sort ไมได เพราะไมใช

DAG

กลมปลายทาง

Page 14: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

กลมตนทาง หางายกวา

1 /14

2 /5 3 /4 7 /12 8 /11

6 /13 9 /10

ทา DFS( G ) ปมทม f มากสด อยในกลมตนทาง

แตเราตองการกลมปลายทาง!

GT เหมอน G แตกลบทศเสนเชอม

ปลายทางของ G คอตนทางของ GT

G

GT

ปลายทาง

ตนทาง

GT เหมอน G แตกลบทศเสนเชอม

ปลายทางของ G คอตนทางของ GT

1 /6

3 /4 2 /5 10 /11 9 /12

7 /14 8 /13

G

GT

ทา DFS( GT ) ปมทม f มากสด อยในกลมตนทางของ GT

คอกลมปลายทางของ G

1. สราง GT (เหมอน G แตกลบทศเสนเชอม)

วธหา SCC : Kosaraju's alg.

G

Page 15: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

วธหา SCC : Kosaraju's alg.

1 /6

3 /4 2 /5 10 /11 9 /12

7 /14 8 /13

GT

1. สราง GT (เหมอน G แตกลบทศเสนเชอม)2. DFS( GT ) แลวจาคา f ระหวางการผานปม3. DFS( G ) ตามลาดบ f จากมากมานอย4. DFS tree ทไดแตละตนคอ SCC

วธหา SCC : Kosaraju's alg.

G

( |V| + |E| )

6

4 5 11 12

14 13

Page 16: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

อลกอรทมแบบละโมบ แนวคด และโครงรางของอลกอรทม ลกษณะของปญหา

optimal substructure greedy choice

ตวอยางปญหาทไดคาตอบ ทดสด ทดเพยงพอ

หวขอ

มเหรยญอย n แบบ : 1, 2, 3, ..., n แตละแบบมคา : v1, v2, v3, ..., vn

ตองการทอนเงนใหลกคามลคา V โดยใชเหรยญเปนจานวนนอยสด

(มเหรยญแตละแบบจานวนไมจากด)

ตวอยาง : สกลเงนไทย มเหรยญ : 1, 2, 5, 10 บาท (ขอไมใชเหรยญสลง) ตองการทอนเงนมลคา 38 บาท คาตอบ : 10 บาท 3 เหรยญ,

5 บาท 1 เหรยญ,2 บาท 1 เหรยญ,1 บาท 1 เหรยญ

ทอนเงน

Greedy Choice

ทอนดวยเหรยญทมคามากสดกอน

สมมตวามเหรยญ 4 บาท มเหรยญ : 1, 2, 4, 5, 10 บาท ตองการทอนเงนมลคา 38 บาท ทอนดวยเหรยญทมคามากสดกอน 10 บาท 3 เหรยญ,

5 บาท 1 เหรยญ,2 บาท 1 เหรยญ,1 บาท 1 เหรยญ

ทอนแบบใชจานวนเหรยญนอยสด 10 บาท 3 เหรยญ, 4 บาท 2 เหรยญ,

ทอนเงน : greedy อาจใชไมได

ไมไดจานวนเหรยญนอยสด

Page 17: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

เหมาะกบ optimization problems(คลาย dynamic programming)

เปนวงวนของการตดสนใจเลอกเพอสรางคาตอบ พจารณาทางเลอกทดท สด ณ ปจจบน

(locally optimal choice, greedy choice) เพอสรางคาตอบเลก ใหญ สมบรณ หวงวาจะไดคาตอบสมบรณทดท สด ตองพสจน

(globally optimal solution)

อลกอรทมแบบละโมบ โครงรางของอลกอรทมGreedy( C ) {S = an empty setwhile( C ) {x = select( C )C = C – {x}if ( isFeasible( S {x} ) ) {S = S {x}if ( isSolution( S ) ) return S

}}return "No Solution"

}

Input : มงาน n งานทตองใชหองจดงานหองหนงsi แทนเวลาเร มใชหองของงาน ifi แทนเวลาเลกใชหองของงาน i

Output: กลมของงานจานวนมากสดทไมใชหองในเวลาเดยวกน

Activity Selection

0 5 10

1 2

5 64

3

7s4 f4

ตวอยาง0 5 10

1

2

3

4

5

6

7

9

8

ตดสนใจเลอกอยางไร ?

Page 18: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

รบใช : เลอก si นอยสด

ใชชวงเวลานอย ๆ : เลอก fi – si นอยสด

เลอกงานทแยงใชหองกบงานอนนอยสด

Greedy Strategy เลอก fi นอยสด : เสรจเรวสด

ใชได

เลอก fi นอยสด0 5 10

1

2

5

6

4

3

7

เรยงลาดบตาม fiเลอกงานทม fi นอยสด

แตไมสนใจงานทมเวลาใชหองเหลอมกบงานทไดเลอกไว

GreedyActivitySelect( A[1..n] ) {sort A by finish timesS = {1}j = 1;for( i = 2; i <= n; i++) {

if ( A[i].s >= A[j].f ) {S = S { i }j = i

}}return S

}

Greedy Activity Selection

O( n log n )

( n )

Page 19: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

ให greedy เลอก i1, i2, i3, ..., ik (เขยนเรยงตาม f )

ให optimal soln คอ j1, j2, j3, ..., jm (เขยนเรยงตาม f )

ตองการแสดงวา k = m จะแสดงใหเหนวา สามารถแปลง

j1, j2, j3, ..., jm เปน i1, i2, i3, ..., ik ได ถา i1 j1 สามารถเปลยน

j1, j2, j3, ..., jm เปน i1, j2, j3, ..., jm ได

Greedy Choice ได optimal soln.

i1Greedy . . .

j1 j2Optimal . . .

f fi1 j1

i2 ik

jmGreedy Choiceเลอกงานทม f นอยสด

i1

ถา i2 j2 i2 ตองม

สามารถเปลยน i1, j2, j3, ..., jm เปน i1, i2, j3, ..., jm ได

Greedy Choice ได optimal soln.

i2

f s f fi1 i2 i2 j2

i1

j1 j2

i2

. . .

Greedy

Optimal

i1

j1 j2 . . .

Greedy

Optimal

. . .

i1 i2

สามารถเปลยน j1, j2, j3, ..., jk เปน i1, i2, i3, ..., ik

เปนไปไมไดท จะม jk+1 ใน optimal soln.เพราะถาม greedy ตองเลอกดวย

ดงน น k ตองเทากบ m greedy choice จงไดจานวนงานทใชหองเทากบของ optimal solution

Greedy Choice ได optimal soln.

i1

j1 j2

i2

. . .

Greedy

Optimal

. . . ik

jk jk+1 . . .

i1 i2 ik

Optimal Substructures คาตอบทดสดของปญหาใหญประกอบดวยคาตอบทดสดของปญหายอย(ใช dynamic prog. ได กตองมคณสมบตขอน)

Greedy choice สงทดสดทถกเลอก ณ ปจจบน เปนสวนหนงของคาตอบสมบรณทดสด

dynamic prog. : แกทกปญหายอย แลวคอยนาผลมาเลอก greedy : เลอกแบบ greedy แลว ทาใหปญหาเลกลง จากนนแคหาคาตอบของปญหายอยนน (ปญหาเดยว) กพอ

คณสมบตของปญหาทใช greedy ได

Page 20: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

ตองการจดใหไดทกงาน

โดยใชหองจดงานจานวนนอยสด

จงออกแบบอลกอรทมสาหรบปญหาน

ถามหองจดงานหลายหอง

ลองทาด

1

4

5

6

3

72

ของ n ชนมหมายเลข : 1, 2, 3, ..., n แตละชนหนก : w1, w2, w3, ..., wn

แตละชนมมลคา : v1, v2, v3, ..., vn

ถงเปหนงใบจของไดหนกไมเกน W ปญหา : จงเลอกของใสถง เพอให

ถงไมขาด ไดมลคารวมมากสด หมายเหต : อนญาตใหเฉอน

(แบง) ของบางสวนได ไดมลคาแปรตามนาหนก

ปญหา Fractional Knapsack

4Kg.

2Kg.

฿650

1Kg.

฿3005Kg.

฿250

0.5Kg.

฿560,000

ของ n ชนมหมายเลข : 1, 2, 3, ..., n แตละชนหนก : w1, w2, w3, ..., wn

แตละชนมมลคา : v1, v2, v3, ..., vn

ถงเปหนงใบจของไดหนกไมเกน W หา <x1, x2, x3, ..., xn>, xk = 0 ถง 1

Optimization Problem

10

tosubject1

k

n

kkk

x

Wwx

n

kkkvx

1maximize

maximization

problems

Knapsack ม Optimal substruct.

1 2

34

65

1 2

34

5

W – w6W

v1 + v3 + v4 + v6 v1 + v3 + v4

คาตอบดสดของปญหาใหญ มคาตอบดสดของปญหายอย

1 2

34

5

W – w6

v1 + v2 + v4 + v5/2

6

+ v6

เปนไปไมไดทจะมากกวา

Page 21: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Greedy Choice

v/w : 2.2 2.0 1.5 1.2 1.0

W = 100

v = 146

เลอกของแพง

v1=66 v2=20 v3=30 v4=60 v5=40w1=30 w2=10 w3=20 w4=50 w5=40 w = 30+50+20

v = 156

เลอกของเบา

v1=66 v2=20 v3=30 v4=60 v5=40w1=30 w2=10 w3=20 w4=50 w5=40 w = 10+20+30+40

v = 164

เลอกของคม (มลคาตอนาหนก)

v1=66 v2=20 v3=30 v4=60 v5=40w1=30 w2=10 w3=20 w4=50 w5=40 w = 30+10+20+40

Greedy Choice ได Optimal Soln.v1/w1 v2/w2 ... vn/wn

12

3 4

ถาเลอกชน 1 ไมเตมชน (x1 < 1) และมการเลอกชน k อน (xk > 0)

• ลดชน k ลง = min( xk , 1 – x1 )• เพมช น 1 ขน • จะไดมลคารวมมากขน

• การเลอกชนทม v1/w1 ใหมากสด จงถกตอง

01

1

k

kwv

wv

12

3 4

Greedy KnapsackGreedyKnapsack( A[1..n], W ) {

sort A by v/w มากไปนอยsumW = 0for( i = 1; i <= n AND sumW < W; i++ ) {

if ( sumW + A[i].w <= W )A[i].x = 1

elseA[i].x = (W – sumW)/A[i].w

sumW += A[i].x * A[i].w}return A

}

v/w : 2.2 2.0 1.5 1.2 1.0

v = 164v1=66 v2=20 v3=30 v4=60 v5=40w1=30 w2=10 w3=20 w4=50 w5=40 w = 30+10+20+40

O( n log n )

A[i].x = min(A[i].w, W – sumW)/A[i].w

O( n )

ให v1/w1 v2/w2 ... vn/wn ให x เปน คาตอบทไดจาก greedy choice ให y เปน คาตอบใด ๆ ทเปนไปได (ถงไมขาด) ตองแสดงใหเหนจรงวา

เลอกคมสด : ไดมลรวมสงสด

n

iii

n

iii vyvx

11

0)(1

n

iiii vyx

Page 22: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

เลอกคมสด : ไดมลรวมสงสด

1 1 . . . . . . 01 xk

1 n2 k

n

ki i

iiii

k

kkkk

i

ik

iiii

wvwyx

wvwyx

wvwyx

1

1

1

)(

)(

)(

xk < 1

n

iiii vyx

1

)(

0

n

ki k

kiii w

vwyx1

)(

k

kk

iiii w

vwyx

1

1)(

k

kkkk w

vwyx )(

x

เลอกคมสด : ไดมลรวมสงสด

n

ki i

iiii

k

kkkk

i

ik

iiii

wvwyx

wvwyx

wvwyx

1

1

1

)(

)(

)(

n

iiii vyx

1

)(

n

iiii

k

k wyxwv

1

)(

n

i k

kiii w

vwyx1

)(

1 1 . . . . . . 01 xk

1 n2 kxk < 10x

Wwxn

iii

1

Wwyn

iii

1

Greedy ใชกบ 0/1 Knapsack ไมได

v/w : 6.0 5.0 4.0

v = 120Fractional Knapsack

v1=30 v2=50 v3=60

w1=5 w2=10 w3=15 w = 5 +10+10

W = 25

v = 80v1=30 v2=50 v3=60

w1=5 w2=10 w3=15 w = 15

v = 90v1=30 v2=50 v3=60

w1=5 w2=10 w3=15 w = 20

v = 110v1=30 v2=50 v3=60

w1=5 w2=10 w3=15 w = 25

0/1 Knapsack

การหาวถส นสด อลกอรทมของดจสตรา (Dijkstra)

การหาตนไมแบบทอดขามตาสด อลกอรทมของพรม (Prim) อลกอรทมของครสกล (Kruskal)

อลกอรทมแบบละโมบอน ๆ

Page 23: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

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

Minimum Spanning Trees Kruskal's algorithm Prim's algorithm

Single-Source Shortest Paths Dijkstra's algorithm Bellman-Ford 's algorithm

All-Pair Shortest Paths Floyd-Warshall's algorithm Johnson's algorithm

Graph Algorithms

–2

2

3

3

24

1

Minimum Spanning Trees Input

กราฟ G = (V,E) เสนเชอมมนาหนก ไมตองมทศ

Output เสนเชอมตาง ๆ (เปนตนไม) ทตอถงทกปม มผลรวมของนาหนกเสนเชอมตาสด

Spanning Tree

MinimumSpanning Tree

ตวอยาง

Page 24: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

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

Prim's Algorithm Prim's Algorithm : Min-Heap

10

9121315

14

12

10

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

Page 25: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Prim's Algorithm : Min-Heap

10

12131514

12

10

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

Prim's Algorithm : Min-Heap

10

64514

12

10

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

ตวอยาง : Prim

3 1

422

3

5

71

32

Prim'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] = truefor each v adj(u) {

if( !inMST[v] AND w(u,v) < d[v] ) {d[v] = w(u,v); H.decreaseKey(v)p[v] = u

}}

}return p;

}O(e log v)

ใช binary heap

dense graph e = (v2)

O(v2 log v)

Page 26: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Prim( 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] = truefor each v adj(u) {

if( !inMST[v] AND w(u,v) < d[v] ) {d[v] = w(u,v); H.decreaseKey(v)p[v] = u

}}

}return p;

}

Prim's AlgorithmG[1..n][1..n] ) {

for ( i = 1; i <= n; i++) { u = minIndex( d )

for ( v = 1; v <= n; i++ ) {

ใช adjacency matrix

G[u][v]

(n)

for ( v = 1; v <= n; v++ ) {

(v2)

G[u][v];

(n2)

; d[u] =

Kruskal's Algorithm

ตรวจวาเกดวงอยางไร (เรว ๆ)

Kruskal is "greedy" เลอกเสนสนสดทเชอมตนไม สองตนทตางกนในปา

Kruskal's Algorithm

Kruskal is "greedy" เลอกเสนสนสดทเชอมตนไม สองตนทตางกนในปา

Krusal( G=(V,E) ) {for each v in V create a set {v}

H = a min heap of all edges ordered by weightsT = an empty listwhile ( T.size() < |V|-1 ) {

(u,v) = H.removeMin()if ( findSet(u) findSet(v) ) {

T.add( (u,v) )unionSet( findSet(u), findSet(v) )

}}return T

}

Kruskal's Algorithm

Page 27: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

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

{ 1, 2, 3, 4,11}

11

1

2

43 11

1

2

4

3

3

11

1

2 4

แบบใดกได อยในตนเดยวกน เปนเซตเดยวกน

แทนกลมเซตดวยปาไม

{11,1, 2, 3, 4 }, { 5, 7 }, { 6, 8, 9 }, { 10 }

11

1

2

43

7

5 8

6

9

10

กลมเซตไมมสวนรวม

(Disjoint Sets)

ขอใชกลมเซตทสมาชกเปนจานวนเตม 1, 2, ..., n

findSet และ unionSet

11

1

2

43

7

5

ใหรากแทนหมายเลขเซต findSet(1) ได 2

findSet(3) ได 2

...

findSet(5) ได 7

findSet(7) ได 7unionSet(2, 7)

11

1

2

43 7

5 11

1

2

43

7

5

การแทน Disjoint Sets

{ 11, 1, 2, 3, 4 }, { 5, 7 }, { 6, 8, 9 }, { 10 }

P[k] คอหมายเลขพอของ k

11

1

2

43

7

5 8

6

9

10

1 2 3 4 5 6 7 8 9 10 11

P 11 2 2 2 7 6 7 6 6 10 2

Page 28: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Disjoint Sets : findSet

findSet( e ) {if ( P[e] == e )

return eelse

return findSet(P[e])}

findSet( e ) {while( P[e] e ) {

e = P[e]}return e

}

ใชเวลาแปรตามความสงของตนไม

11

1

2

43

7

5 8

6

9

10

1 2 3 4 5 6 7 8 9 10 11

11 2 2 2 7 6 7 6 6 10 2P

Disjoint Sets : unionSet

unionSet( s, t ) {P[t] = s;

}

unionSet(2, 7)

11

1

2

43 7

5 11

1

2

43

7

5

unionSet(7, 2)

11

1

2

43

7

5 8

6

9

10

1 2 3 4 5 6 7 8 9 10 11

11 2 2 2 7 6 7 6 6 10 2P

ตองการตนไมเตยทาให findSet เรว

Disjoint Sets : unionSet

11

1

2

43

7

5 8

6

9

10

1 2 3 4 5 6 7 8 9 10 11

11 2 2 2 7 6 7 6 6 10 2P

2 1 1 0H

unionSet( s, t ) {if ( H[s] > H[t] ) {

P[t] = s;} else {

P[s] = t;if (H[s] == H[t]) H[t]++;

}}

O(1)

ตนเตยเปนลกของรากของตนสง

unionSet ใหตนไมสงสด ๆ

Page 29: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

unionSet ใหตนไมสงสด ๆ1

4

6

4

1

unionSet จนขอมล n ตวอยในหนงเซต

จะไดตนไมสงสด สง log2 n

สรป :unionSet O(1)

findSet O(log n)

nn

kknC 2),(

0

16 = 24

= C(4, 0)

= C(4, 1)

= C(4, 2)

= C(4, 3)

= C(4, 4)

Krusal( G=(V,E) ) {D = 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 ) {

(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

}

Kruskal's Algorithm

O(e log e)

O(e log v)

simple graphs : e = O(v2)

เลอกสนสดนาไปส MST

A

V - AwA wV-A

we1

we0

ใหตนดาเปน MSTดงนน wA + we1 + wV-A ตาสดให we0 we1ลบ e1, เพม e0ได spanning tree ใหมทม w w ของ MSTแสดงวา e0 อยใน MST

วถสนสดจากแหลงตนทางเดยว ให G เปนกราฟระบทศทาง เสนเชอมมความยาว ตองการหาวถส นสดจากปม s ใน G ไปยงปมอน ๆ สงทได : Shortest-path tree

p[u] = s, d[u] = 5

p[v] = u, d[v] = 21

p[s] = null, d[s] = 0

8 5

10

2 3

1812

14

4 26

3016

s

u

v

คาเตอน

Shortest Path Tree ไมใช Minimum Spanning Tree

0

8 5

8

20 21

22

Page 30: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

เสนตง + คลายเสนd[u] เกบความยาวของวถส นสดเทาทรจาก s ไป u

2

พจารณาเสนเชอม (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) is tense

คลายเสน (u,v)relax (u,v)

10

s

u v15

แนวคดของ Dijkstra's Algorithm

s

3 4

568

3 4

21

5 4

13

10

15

8 9

92

7 3 3

3

5

Shortest path tree

ขยาย Shortest path tree โดยเลอกปมทม d[] ตาสด

2 9

Dijkstra Algorithm : ตวอยาง

3 2

1

0 5

108

4

6 3

712

0

s

Dijkstra( G=(V,E), s) {for each v V {

d[v] = ; p[v] = null;}d[s] = 0H = a min heap of all vertices ordered by d[] while (H ) {

u = H.removeMin()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

}}

}return d

}

อลกอรทมของ Dijkstra

ถา เสน (u,v) ตง

relax (u,v)

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

O(e log v)

Page 31: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Dijkstra คลาย PrimPrim( G=(V,E) ) {

for each 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] = truefor each v adj(u) {

if( !inMST[v] AND w(u,v) < d[v] ) {d[v] = w(u,v); H.decreaseKey(v)p[v] = u

}}

}return p;

}

Dijkstra( G=(V,E), s ) {

d[u]+

d[u]+

ถาม negative-weight edges

s

10

19 6 9

9

6

–17

+2

–2

ถาม negative-weight edges

0

4

3 5

– 7

1

2

s

Dijkstra's algorithm อาจใหคาตอบผด

ถาม negative-weight edges

0

3 5

– 1

2

s

Dijkstra's algorithm อาจใหคาตอบถก

Page 32: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

Negative-Weight Cycles

s 2 2 4

1– 2 = 2 + 1 – 2 = 1

s 2 2 4

1– 4 = 2 + 1 – 4 = –1

negative-weight cycle

หาวถสนสดไมได เพราะมนสนลงเรอย ๆ เมอหมนในวง

อลกอรทมของ Bellman-Ford ใชไดกบ negative-weight edge จะแจงใหทราบ ถาม negative-weight cycle ใช dynamic programming วถส นสดจาก s ไป t

ตองไมผานปมซา มเสนเชอมในวถอยางมาก |V| – 1 เสน

ให d(i, v) แทนความยาวของวถส นสดจาก s ไป vทมเสนเชอมอยางมาก i เสน

d(i, v) = min d(i – 1, v)

min { d(i – 1, u) + w(u, v) }uAdj(v)

d(?, s ) = 0, d(0, v) = ตองการ d( |V|– 1, v )

su

ใชอยางมาก i – 1 เสนv

BellmanFord(G=(V,E), s) {for each v V {

d[v] = ; p[v] = null;}d[s] = 0for (i=1; i<|V|; i++) {

for each v V for each u Adj(v)

if ( d[u]+w(u,v) < d[v] ) {d[v] = d[u] + w(u,v)p[v] = u;

}}return d

}

อลกอรทมของ Bellman-Ford

di(v) = min di – 1(v)

min { di – 1(u) + w(u, v) }uAdj(v)

for each edge (u,v) in E

(|V|)

(|E|)

(ve)

–8 2

1

0 5

84

6 30 s

–3

–1

–3

Bellman-Ford : ตวอยาง

a

b

c

d

e

f

s, a, b, c, d, e, f

Page 33: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

BellmanFord( G=(V,E), s ) {for each v V {

d[v] = ; p[v] = null;}d[s] = 0for (i=1; i<|V|; i++)

for each edge (u,v) Eif ( d[u]+w(u,v) < d[v] ) {

d[v] = d[u] + w(u,v); p[v] = u;}

for each edge (u,v) Eif ( d[u]+w(u,v) < d[v] ) return null

return d;}

ม negative-weight cycle ? relax เสนตงทกเสนเปนจานวน |V|-1 รอบ ตรวจสอบเสนเชอมทกเสนอกรอบ ถายงมเสนตง ม negative-weight cycle

1 2 3 4

1 - 3 4 1

2 2 - 4 1

3 2 3 - 1

4 2 3 4 -

P

วถสนสดของทกคปมในกราฟกราฟ G (V, E) เสนเชอมมนาหนก มทศทาง

เสนเชอมยาวเปนลบได แตตองไมมวงทความยาวรวมเปนลบ

2

1 3

4 2

-4-2

24

7

1

1 2 3 4

1 0 2 6 2

2 -2 0 4 0

3 -6 -4 0 -4

4 -2 0 4 0

D 1 2 3 41 0 - 7 2

2 -2 0 - 1

3 - -4 0 2

4 - - 4 0

W

shortest path tree ของวถสนสดจากปม 2 ถงปมอน ๆ

การหาวถสนสดของทกคปม หา single-source shortest paths ของทกปม

เรยก Dijkstra v ครง (ความยาวเสนเชอมหามเปนลบ)binary heap + adj. list : O(v . e log v )linear array + adj. matrix : O(v . v 2) = O(v 3)

เรยก Bellman-Ford v ครง (เสนเชอมยาวเปนลบได)O(v 2e ) ซงเปน O(v 4) สาหรบ dense graph

ใชกาหนดการพลวต ตรงไปตรงมา : Θ(v 4) repeated squaring : Θ(v 3 log v ) Floyd-Warshall : Θ(v 3)

นยามความยาวของวถสนสด Single-source

ให dm (j) แทนความยาวของวถสนสดจาก s ไป jทมเสนเชอมอยางมาก m เสน

All-pair ให dm (i, j) แทนความยาวของวถสนสดจาก i ไป jทมเสนเชอมอยางมาก m เสน

ขอเปลยนเปน dm (i, j) เปน di, j (m)

Page 34: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

คาตอบใหญไดจากคาตอบยอย ให di,j(m) แทนความยาวของวถส นสดจาก i ไป jทใชเสนเชอมไมเกน m เสน

i j. . .

v

3

1

2 w1,j

di,j(m) = min { di,k(m–1) + wk,j }1 k v

di,i(0) = 0, di,j(0) = , di,j(1) = wi,j , wi,i = 0

การคานวณความยาวของวถสนสด วถส นสดยอมไมผานปมซา ถา G ม v ปม, วถส นสดของปมคใด ๆ ตองใชเสนเชอมไมเกน v – 1 เสน

ให D(m) คอเมตรกซทเกบ dij(m) D(1) = W (W คอ adjacency matrix ของ G)

เร มท D(1) คานวณหา D(2), D(3), ..., D(v – 1)

1

2

3

4 2

-4-2

24

7

1

ความยาวของวถสนสดจาก i ไป j ทใชเสนเชอมไมเกน m เสน

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

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) {

dm[i][j] = min( dm[i][j], d[i][k] + W[k][j]);}

}}return dm;

}

แบบชาAPSP_Slow( W[1..v][1..v] ) {

D[1] = Wfor(m = 2; m < v; m++)

D[m] = ExtendShortestPath( D[m-1], W );return D[v-1];

}

(v4)

หา D(2), D(3), ..., D(v – 1)

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

ปรบปรงใหเรวขน แบบชา : D(m) หาจาก D(m-1) กบ D(1)

แบบเรว : D(m) หาจาก D(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(2k) 2k v-1

เชน ตองการ D(13) กหา D(16), ตองการ D(57) กหา D(64)

i jk

ใชไมเกน m – 1 เสน

D(m – 1) D(1)

i jk

ใชไมเกน m/2 เสน

D(m/2) D(m/2)

ใชไมเกน m/2 เสน

Page 35: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

APSP_RepeatedSquare( W[1..v][1..v] ) {D[1] = W; m = 1;while (m < v-1) {

D[2*m] = ExtendShortestPath( D[m], D[m]);m = 2*m;

}return D[m];

}

แบบกาลงสองซา(v3 log v)

ik

ใชไมเกน m เสน

D(m) jD(m)

ใชไมเกน m เสน

2c v-1c log2(v-1)c = log2(v-1)

ใชไมเกน 2m เสนi j

D(2m)

อลกอรทมของ Floyd-Warshall เปลยนแนวคดการเขยน recurrence ให di,j(k) แทนความยาวของวถส นสดจากปม i ไป j ทสามารถใชจดใน {1,2,3,...,k} เปนปมระหวางทางdi,j(0) คอ wi,j (ไมมปมระหวางทาง)

ตองการ di,j(v) , v = จานวนปม (สามารถใชไดทกปม)

ki j. . .1 2 k – 1

di.j(k) = min( di,j(k – 1), di,k(k – 1) + dk,j (k – 1) )di,j(0) = wi,j

FloydWarshall( W[1..v][1..v] ) {D = Wfor (k = 1; k <= v; k++) {

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;

}

อลกอรทมของ Floyd-Warshall

(v3)

di. j(k) = min( di,j(k – 1), di,k(k – 1) + dk,j (k – 1) )di, j(0) = wi, j

ใหใชปม {1,2,...,k} เปนปมระหวางทาง

การหาวถสนสดของทกคปม ใชกาหนดการพลวต

ตรงไปตรงมา : Θ(v 4) repeated squaring : Θ(v 3 log v ) Floyd-Warshall : Θ(v 3)

อลกอรทมของ Johnson O(v . e log v ) ดสาหรบ sparse graph

Page 36: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

อลกอรทมของ Johnson ใช Dijkstra หา single-source shortest path ของทกปม linear array : O(v . v 2) = O(v 3) binary heap : O(v . e log v )

แต Dijkstra ไมรบ negative-weight edges ดงน น

เปลยน G ใหเปนกราฟใหม K ทไมมเสนเชอมตดลบ(โดยวถสนสดของ G ตองเหมอนวถสนสดของ K)

แลวใช Dijkstra จานวน v ครงเพอหาวถสนสดของทกคปม

w*i,j = wi,j + h(i) – h(j)

การปรบความยาวเสนเชอม

ใหทกเสนยาวอก +3

1 –3 14

4 0 47

7 5 2 41 –3 14

9 7 3 01 –3 14

3 0 –17

3 1 413

1 + 9 – 7 = 3h( )

ความยาวใหมของวถai b j

wi,a wa,b wb,j

ai b j

w*i,a w*a,b w*b,j

w*i,a = wi,a + h(i) – h(a)

w*a,b = wa,b + h(a) – h(b)

w*b,j = wb,j + h(b) – h(j)

w*(i a b j) = w(i a b j) + h(i) – h(j)

w*i,a+ w*a,b+ w*b,j = wi,a+ wb,j+ wa,b +h(i) – h(a) + h(a) – h(b) + h(b) – h(j)

= wi,a+ wb,j+ wa,b + h(i) – h(j)

พจารณาปม i กบ j วถใด ๆ ของปมคน ถงแมผานปมตางกนแตมปมปลายเหมอนกน

ความยาวใหมของวถใด ๆ ของปมคน เพมเปนปรมาณเทากน

ดงน นวถส นสด (หลงปรบความยาว) ไมเปลยน ความยาวของวงในกราฟกไมเปลยน

h(i) มคาเทาไรกได วถสนสดไมเปลยน

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)

Page 37: กราฟเบื้องต้นsomchai/2110327/... · กราฟประเภทตาง่ ๆ วถิและวงี การแทนกราฟ การแวะผ่าน

เตมปม s และเสนเชอมยาว 0 จาก s ถงทกปม หาวถส นสดจาก s ถงทกปม (ใช Bellman-Ford) ให h(i) = ความยาวของวถส นสดจาก s ไป i ดเสนเชอม (i, j) จะไดวา h(i) + wi,j h(j) ดงน น w*i,j = wi,j + h(i) – h(j) 0

วธหา h(i) ททาใหไมมเสนเชอมตดลบ

1 –3 14

0 0 0 0s

0 0 –3 –2

61 0 0

s

ij

Johnson( G ) {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 {

for each edge (i,j) G.EG.w(i,j) += h[i] – h[j]

for each vertex i G.V {d = Dijkstra(G, i)for each vertex j G.V

D[i][j] = d[j] – (h[i] – h[j])}return D

}}

อลกอรทมของ Johnson

ถา Dijkstra ใช binary heap จะทาใหJohnson ใชเวลา O(ve log v ) ซงดกวาFloydWarshall เมอใชกบ sparse graph

(ve)

O(e log v)

ถา G มวง c ทมความยาวรวมของวงใน c เปน 0 อยากทราบวา ความยาวใหมของเสนเชอม w* แตละเสนใน c หลงการปรบความยาว จะเปนเทาใด

จรงหรอไม ถา G เปน strongly connected graph เราไมจาเปนตองเพมปม s ตาม Johnson

แตใชปมใดกไดใน G เปนปมเรมเพอใช Bellman-Ford หา h(i) กได

ลองคดด