Duy t theo chi u sâu tr c – gi i thu t quyprocedure begin n the ready stack; while the ready stack is not empty do get a vertex from the stack, process it, and add any neighbor vertex th
Trang 1ph c t p c a các gi i thu t th
Trang 2N i dung
1 Các gi i thu t th c n b n
Trang 4I H
Trang 5m t nút khác trong th M t th mà không liên thông
thì bao g m nhi u thành ph n liên thông
l p l i
Trang 6Thu t ng (tt
tiên và nh cu i cùng trùng nhau t l i i t m t nh
quay v chính nó)
M t th không có chu trình c g i là cây (tree) M t
nhóm các cây không liên thông c g i là r ng ( forest )
Trang 7Thu t ng (tt
các th v i ch m t s ít c nh m t i c g i là th dày
undirected graphs Trong các th có tr ng s weighted
graphs , nh ng giá tr s (tr ng s ) c g n vào m i c nh
di n t thí d kho ng cách hay chi phí
Trong th có h ng (directed graphs) các c nh l m t
chi u : m t c nh i t x sang y ch không ph i i t y sang x.Các th có h ng, có tr ng s còn c g i là các m ng
(networks)
Trang 8Cách bi u di n th
Ta ph i ánh x các tên nh thành nh ng s nguyên trong
t m tr gi a 1 và V
Gi s có t n t i hai hàm:
- hàm index: chuy n i t tên nh thành s nguyên
- hàm name: chuy n i s nguyên thành tên nh
Có hai cách bi u di n th :
- dùng ma tr n k c n
- dùng t p danh sách k c n
Trang 11for x: = 1 to V do /*initialize the matrix */
for y: = 1 to V do a[x, y]: = false;
for x: = 1 to V do a[x, y]: = true;
Trang 12Cách bi u di n b ng t p danh sách k c n
Trong cách bi u di n này, m i nh mà n i t i m t
nh c k t thành m t danh sách k c n
(adjacency list ) cho nh ó.
program adjlist (input, output);
const maxV = 100;
type link = ↑node
node = record v: integer; next: link end;
var j, x, y, V, E: integer;
t, x: link;
adj: array[1 maxV] of link;
Trang 13new(t); t↑.v: = x; t↑.next: = adj[y];
adj[y]: = t; /* insert x to the first element of
y’s adjacency list */new(t); t↑.v = y; t↑.next: = adj[x];
adj[x]:= t; /* insert y to the first element of
x’s adjacency list */end;
end
Trang 15Các ph ng pháp duy t th
t hay tìm ki m trên th : vi ng m i nh/nút trong th m t cách có h th ng.
Có hai cách chính duy t th :
- duy t theo chi u sâu tr c (depth irst search )
- duy t theo chi u r ng tr c (breadt irst search).
Trang 16Duy t theo chi u sâu tr c – gi i thu t quy
procedure
begin
n the ready stack;
while the ready stack is not empty do
get a vertex from the stack, process it,
and add any neighbor vertex that has not been processed
for each vertex, say n, in the graph do
if the status of n is “not yet visited” then visit(n)
Trang 17val: array[1 maxV] of integer;
procedure visit (k: integer);
Trang 180;
for k: = 1 to V do val[k]: = 0; /initialize
the status of all vetices */
for k: = 1 to V do
if val[k] = 0 then visit(k)
end;
Ghi chú: M ng val[ V] ch a tr ng thái c a các nh
val[k] = 0 n u nh k ch a h c vi ng ( not yet visited ),
val[k]: = j ngh a là nh jth mà c vi ng trong quá trìnhduy t là nh k
Trang 19G E
A
G E
C
A
G E
C
A
G E
C B
F A
G E
C B
F Hình 4.2 Duy t theo chi u sâu tr c
Trang 20Nh v y k t qu c a gi i thu t duy t FS trên th cho
hình 4.1a v i t p danh sách k c n cho hình 4.1c là
A F E G D C G
L u ý: th t c a các nh trong các danh sách k c n có nh
h ng n th t duy t c a các nh khi áp d ng DFS
Trang 21ph c t p c a duy t theo chi u sâu tr c
Tính ch t 1.1 uy t theo chi u sâu tr c m t
th bi u di n b ng các danh sách k c n òi h i th i gian t l V E.
Ch ng minh: Chúng ta ph i gán tr cho m i ph n
t c a m ng val (do ó t l v i O(V)), và xét m i
nút trong các danh sách k t c n bi u di n th (do
ó t l v i O(E)).
Trang 22t theo chi u sâu tr c bi u di n b ng ma
Trang 24Duy t theo chi u sâu tr c – không quy
procedure list-dfs;
var id, k: integer; val: array[1 max V] of integer;
procedure visit(k: integer);
var t: link;
begin
push(k);
repeat
k: = pop; id:= id + 1; val[k]: = id; /* change the status of k to “visited” */
t =: adj[k]; /* find the neighbors of the vertex k */.
while t <> z do begin
if val[t↑.v] = 0 then begin
push(t↑.v); val[t↑.v]: = -1 /* change the status of t↑.v to “ready” */ end
else if val[t↑.v] = -1 then shift t↑.v to the top of the stack;
t: = t↑.next end
until stackempty
Trang 25begin
0; stackinit;
for k: = 1 to V do val[k]: = 0; /* initialize the
status of all vertices */
Trang 26B C G F
B C A
E
Hình 4.3a DFS d a vào stack G
Trang 28Duy t theo chi u r ng tr c
Khi duy t th n u ta dùng m t queue thay vì m t stack, ta s
i n m t gi i thu t duy t theo chi u r ng tr c search).
(breadth-first-procedure
procedure (
begin
n o the ready queue;
while the ready queue is not empty do
get a vertex from the queue, process it, and add any neighbor
vertex that has not been processed to the queue and
change their status to ready.
end;
begin
Initialize status;
for each vertex, say n, in the graph
if the status of n is “not yet visited” then visit(n)
Trang 29procedure
var id, k: integer; val: array[1 max V] of integer;
procedure visit(k: integer);
var t: link;
begin
put(k); /* put a vertex to the queue */
repeat
k: = get; /* get a vertex from the queue */
id: = id + 1; val[k]: = id; /* change the status of k to “visited” */
t: = adj[k]; /* find the neighbors of the vertex k */
Trang 300; queue-initialze;
for k: = 1 to V do val[k]: = 0; /initialize the
status of all vertices */
for k: = 1 to V do
if val[k] = 0 then visit(k)
end;
t theo chi u sâu tr c và duy t theo chi u r ng tr c
ch khác nhau ch gi i thu t u dùng stack và gi i thu tsau dùng hàng i Do ó, ph c t p tính toán c a DFS vàBFS là nh nhau
Trang 322 th c tr ng s
Chúng ta mu n mô hình hóa nh ng bài toán th c t s d ng
nh ng tr ng s weights hay chi phí (costs) c g n vào
Bài toán th nh t là bài toán cây bao trùm t i thi u; bài toán
th hai là bài toán tìm ng i ng n nh t
Trang 33Cây bao trùm t i thi u
M t cây bao trùm t i thi u minimum spanning tree c a m t
th có tr ng s là m t t p các c nh ch m t t c các nhsao cho t ng tr ng s c a các c nh là nh nh t
Cây bao trùm t i thi u không nh t thi t là duy nh t trong
h
9 14
10 4
7
2 4
8
11
Hình 4.5 Cây bao
trùm t i thi u
Trang 34Gi i thu t Prim
Gi i thu t Prim là gi i thu t gi i bài toán cây bao trùm
t i thi u Gi i thu t này c ng trình bày m t chi n l c
gi i m t bài toán t i u hóa: gi i thu t tham lam
gi i t i u toàn c c cho các bài toán
Tuy nhiên i v i bài toán cây bao trùm t i thi u, ta có th
ch ng minh r ng chi n l c tham lam có th em l i
cây bao trùm v i t ng tr ng s t i thi u
Trang 35Xây d ng cây bao trùm t i thi u
Gi s chúng ta có m t th vô h ng, liên thông
G = (V, E) v i hàm gán tr ng s w: E R và mu n tìm m tcây bao trùm t i thi u cho G
Có m t gi i thu t t ng quát mà t o d ng d n cây bao trùm
t i thi u m t lúc thêm m t c nh
Gi i thu t này duy trì m t t p A mà luôn luôn là m t t p
con c a m t cây bao trùm t i thi u
T i m i b c, m t c nh (u, v) c ch n thêm vào t p A
mà không vi ph m h th c b t bi n A {(u, v)} luôn luôn là
m t t p con c a m t cây bao trùm t i thi u
Trang 37Gi i thu t Prim
Trong gi i thu t Prim, t p A hình thành m t c u trúc cây M t
c nh an toàn c a vào A th ng là c nh có tr ng s nh
nh t n i cây A v i m t nh không thu c v cây
Cây bao trùm kh i i t m t nút r b t k r và phát tri n cho
n khi cây ph t t c m i nh trong V T i m i b c, m t
V - A
Trong quá trình th c hi n gi i thu t này, t t c nh ng nh
c nh có tr ng s nh nh t c a nh ng c nh n i v v i m t nhtrong cây Theo qui c key[v] = n u không t n t i m t
c nh nh v y
Trang 38Tr ng p[v] l u tên c a nh cha c a nh v trong cây.
for each v ∈ Q and w(u, v) < key[v] then
/ * update the key field of vertice v */
begin
p[v] := u; key[v]: = w(u, v) end
end
end;
Trang 392 1
2 7
2 1
2 7
Trang 402 1
2 7
2 1
2 7
11
8
4
Trang 412 1
2 7
2 1
2 7
11 8
4
Trang 422 1
2 7
2 1
2 7
11
8
4
Trang 432 1
2 7
11 8
4
ph c t p c a gi i thu t Prim tùy thu c vào cách
mà chúng ta thi công hàng i có u tiên
Trang 44ph c t p c a gi i thu t Prim
Tính ch t: N u Q c thi công nh là m t heap nh phân thì
th i gian tính toán c a gi i thu t Prim là O(E lgV)
N u Q c thi công nh là m t heap nh phân, chúng ta có
th l p ra m t heap trong b c kh i t o v i chi phí th i gian
là O(V)
Vòng l p while c th c hi n V l n và vì m i thao tác
EXTRACT-MIN có ph c t p O(lgV), chi phí tính toán
cho t t c các l nh g i EXTRACT-MIN là O(VlgV)
Vòng l p for bên trong vòng l p while c th c hi n t ng
c ng O(E) l n, vì t ng chi u dài c a t t c các danh sách k
c n là 2E Vi c c p nh t khóa c a nh v trong heap t n
O(lgV) l n Nh v y, t ng chi phí tính toán c a gi i thu t
Prim là O(V lgV + 2E lgV) = O(E lgV)
Trang 453 th có h ng
Các th có h ng là các th trong ó các c nh n i v icác nút có h ng
I H
Hình 4.7 M t thí d v th có h ng
Trang 46Th ng thì h ng c a các c nh bi u th m i liên h tr c
sau precedence relationship trong ng d ng c mô hìnhhóa
m t ng dây s n xu t (assembly line)
Trong ph n này, chúng ta xem xét các gi i thu t sau:
- tính bao óng truy n (transitive closure)
- s p th t topo (topological sorting)
Trang 47Vì th bao óng truy n thì th ng là th dày, do ó
chúng ta dùng cách bi u di n ma tr n k c n
Trang 48if a[y, j] then a[x, j]: = true;
S Warshall ra gi i thu t này n m 1962, d a trên m t
quan sát n gi n: N u t n t i m t cách i t nút x n
x n nút j
Trang 50Tính ch t 5.3.1 Gi ithu t Warshall tính baoóng truy n v i chi phíO(V3).
Trang 51I H
2 3
1
1 1
4 2
5
3
2 1
2 2 1
1 1
1
Trang 55Gi i thích gi i thu t Floyd
Gi i thu t Floyd l p V b c trên ma tr n k c n a
Sau b c l p th y, a[x, j] s ch a chi u dài nh nh t c a
b t k l i i nào t nh x n nh j mà không i qua
nh ng nh mang ch s l n h n y Ngh a là, x và j có th
b t k nh nào nh ng nh ng nh trung gian trên l i i
T i b c l p th y, ta tính các ph n t c a ma tr n a b ngcông th c sau:
ay[x,j] = min( ay-1[x,j], ay-1[x, y] + ay-1[y, j])
Ch s y ch tr c a m t ph n t trong ma tr n a sau b c
l p th y
Trang 58T p th t riêng ph n
M t quan h trên t p S mà th a hai tính ch t b t i x ng
và truy n là m t quan h th t riêng ph n partial ordering
c a S, và m t t p có trên nó m t quan h th t riêng ph nthì c g i là t p th t riêng ph n (partially order set )
coi nh là m t t p th t riêng ph n
Trang 60X p th t tôpô
Cho G là m t th có h ng không chu trình M t
th t tôpô (topological sort)T c a G là m t th t
tuy n tính mà b o toàn th t riêng ph n ban u
trong t p nh V[G].
Ngh a là: n u u < v trong V (t c là n u có m t l i i
t u n v trong G), thì u xu t hi n tr c v trong th
t tuy n tính T.
Trang 61I H
theo th t sau:
J K L M A G H I F E D B C
Trang 62S p th t tôpô1 (Ph ng pháp
Có vài ph ng pháp s p th t tôpô
Ph ng pháp 1
Ý t ng c n b n là tìm m t nút không có nút i sau (no
successor) lo i b nó ra kh i th và a nó vào m t danh
sách
L p l i quá trình này cho n khi th r ng thì s sinh ra m tdanh sách o ng c danh sách này ta s c th t tôpô.Algorithm:
while aph has a node with no successors do
remove one such node from the graph and
add it to the end of a list
if the loop terminates with the graph empty
then the list shows the reserse of a topological order
else the graph contains a cycle
Trang 63I H
D E F I H G A M L K J
Hình 4.8 S p th t tôpô b ng ph ng pháp 1
Trang 64Start with nodes with no predecessor, put them in the stack.
while the stack is not empty do
if the node at top of the stack has some successors
then
push all its successors onto the stack
else pop it from the stack and add it to the list
Trang 658 5
Trang 66nh i tr c p[v] mà là m t nh khác hay là NIL Gi i thu tgán tr cho thu c tính p sao cho d y các nh i tr c xu t
phát t nh v s cho ra l i i ng n nh t t s n v
Trang 67Ta g i d[v] là c l ng l i i ng n nh t (shortest path estimate).
Quá trình n i l ng m t c nh (u, v) bao g m vi c th xem ta có
th c i thi n l i i ng n nh t n v mà ang tìm th y b ng cách iqua u và n u nh v y, ta c p nh t d[v] và p[v] M t b c n i l ng
s làm gi m c l ng l i i ng n nh t d[v] và c p nh t thu c
tính p[v]
Nh ng l i i ng n nh t v s n i l ng
Trang 68v
v Relax(u,
(
ì 4.10: S n i l ng c a m t c nh
Trang 69Trong gi i thu t sau ây, ta dùng hàng i có u tiên Q
ch a t t c các nh trong V-S, l p khóa theo thu c tính d Và
Gi i thu t Dijkstra
Trang 70procedure dijkstra(G, w, s);
/* G is a graph, w is a weight function and s is the source node */begin
for each vertex v ∈ V[G] do /* initialization */
begin d[v]: = ∞; p[s]: = NIL end;
d[s]: = 0; S: = ∅; Q: = V[G]
while Q is not empty do
begin
u: = EXTRACT-MIN (Q); S: = S ∪ {u};
for each vertex v ∈ Adj [u] do /* relaxation */
if d[v] > d [u] + w(u, v) thenbegin d[v]: = d[u] + w(u, v); p[v]: = u endend
end
Trang 71-S a vào t p S, nó th c s s d ng chi n l c tham
lam
• Gi i thu t tham lam th ng không m b o em l i l i gi i
t i u trong tr ng h p t ng quát, nh ng i v i bài toánnày, gi i thu t Dijkstra th c s em l i nh ng l i i ng n
nh t
• Gi i thu t Dijkstra t ng t nh gi i thu t Prim dùng
tính cây bao trùm t i thi u Nó c ng dùng m t hàng i có
nh ó vào t p, và i u ch nh l i tr ng s c a nh ng nhcòn l i bên ngoài t p
Gi i thu t Dijkstra
Trang 72M t thí d
10
0 0
Trang 745
2 3
10
5
2 3
(s, : <s, x, u> (s, v : <s, x, u, v>
(s, x : <s, x> (s, y : <s, x, y, y>
Trang 75í , m i thao tác EXTRACT-MIN t nO(V), và có t t c |V| thao tác nh v y, do ó ta có m t chiphí tính toán cho thao tác này là O(V2)
nh trong các danh sách k c n dj[v] c xét úng m t
l n trong su t ti n trình c a gi i thu t
Vì t ng s nh trong t t các các danh sách k c n là |E|, có
t t c |E| b c l p cho vòng l p for, v i m i l n l p t n O(1)
Th i gian tính toán c a gi i thu t là
O(V2 + E) = O(V2)
ph c t p c a gi i thu t Dijkstra
Trang 76• à ó ê
ú , m i thao tác EXTRACT-MIN t n chi phí O(lgV),
và có t t c |V| thao tác này, do ó ta có t ng chi phí cho
thao tác EXTRACT-MIN là O(VlgV)
Phép gán d[v]: = d[u] + w(u, v) òi h i m t thao tác c p
nh t khóa c a nh v trong heap và nó t n O(lgV) Có t t c
|E| thao tác nh v y Do ó t ng th i gian tính toán c a gi ithu t là
O(V lgV + E lgV)
ph c t p c a gi i thu t Dijkstra