Post on 29-Jun-2020
กราฟเบองตน
นยามตวอยางการใชกราฟกราฟประเภทตาง ๆ
วถและวงการแทนกราฟการแวะผาน
สภาพการเชอมโยงของกราฟ
หวขอ
กราฟ (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
ใชกราฟแทน ...
/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)
กราฟกบการเชอมสายสญญาณ กราฟประเภทตาง ๆ 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 )
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 >
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
การคนตนไม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
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
ไมควรทาแบบน มวธอนทดกวา
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}
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
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
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
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 ทแปลงเปนแบบไมคดทศ แลวเปนกราฟตอถงกน
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
กลมปลายทาง
กลมตนทาง หางายกวา
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
วธหา 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
อลกอรทมแบบละโมบ แนวคด และโครงรางของอลกอรทม ลกษณะของปญหา
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 อาจใชไมได
ไมไดจานวนเหรยญนอยสด
เหมาะกบ 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
ตดสนใจเลอกอยางไร ?
รบใช : เลอก 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 )
ให 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 ได
ตองการจดใหไดทกงาน
โดยใชหองจดงานจานวนนอยสด
จงออกแบบอลกอรทมสาหรบปญหาน
ถามหองจดงานหลายหอง
ลองทาด
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
เปนไปไมไดทจะมากกวา
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
เลอกคมสด : ไดมลรวมสงสด
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)
อลกอรทมแบบละโมบอน ๆ
อลกอรทมบนกราฟ
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
ตวอยาง
สรางเขาวงกตดวย MST สรางเขาวงกตดวย MST
Prim's Algorithm Prim's Algorithm : Min-Heap
10
9121315
14
12
10
Prim is "greedy"เลอกเสนสนสดทตอกบตนไมทกาลงโต
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)
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
แทนเซตดวยตนไม
{ 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
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 ใหตนไมสงสด ๆ
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
เสนตง + คลายเสน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)
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 อาจใหคาตอบถก
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
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)
คาตอบใหญไดจากคาตอบยอย ให 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 เสน
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
อลกอรทมของ 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)
เตมปม 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) กได
ลองคดด