R t nhi u thu t toán trên đ th đ c xây d ng d a trên vi c duy t t t c các đnh c a đ th sao cho m i đnh đ c vi ng th m đúng m t l n. Nh ng thu t toán nh v y đ c g i là thu t toán tìm ki m trên đ th . Chúng ta c ng s làm quen v i hai thu t toán tìm ki m c b n, đó là duy t theo chi u sâu (Depth First Search) và duy t theo chi u r ng (Breath First Search).
T t ng c b n c a thu t toán tìm ki m theo chi u sâu là b t đ u t i m t đnh v0 nào đó, ch n m t đnh u b t k k v i v0 và l y nó làm đnh duy t ti p theo. Cách duy t ti p theo đ c th c hi n t ng t nh đ i v i đnh v0.
ki m tra vi c duy t m i đnh đúng m t l n, chúng ta s d ng m t m ng g m n
ph n t (t ng ng v i n đnh), n u đnh th i đã đ c duy t, ph n t t ng ng trong m ng có giá tr FALSE. Ng c l i, n u đnh ch a đ c duy t, ph n t t ng ng trong m ng có giá tr TRUE. Thu t toán tìm ki m theo chi u sâu b t đ u t đnh v nào đó s duy t t t c các đnh liên thông v i v. Thu t toán có th đ c mô t b ng th t c đ qui DFS()
trong đó: chuaxet - là m ng các giá tr logic đ c thi t l p giá tr TRUE void DFS(int v){
Th m_ nh(v); chuaxet[v] = FALSE; for u ∈ke(v) { if (chuaxet[u] ) DFS( v); } } Th t c DFS() s th m t t c các đnh cùng thành ph n liên thông v i v m i đnh đúng m t l n. đ m b o duy t t t c các đnh c a đ th (có th có nhi u thành ph n liên thông), chúng ta ch c n th c hi n :
for( i=1; i≤n; i++)
chuaxet[i] = TRUE; for( i:=1;i≤ n; i++)
if (chuaxet[i] )
DFS( i);
Chú ý: Thu t toán tìm ki m theo chi u sâu d dàng áp d ng cho đ th có h ng. i v i đ th có h ng, chúng ta ch c n thay các c nh vô h ng b ng các cung c a đ th có h ng.
Ví d 1. Áp d ng thu t toán tìm ki m theo chi u sâu v i đ th trong hình sau:
2 6 8 7 1 4 5 3 10 11 9 12 13 Hình 5.11. th vô h ng G K t qu duy t: 1, 2, 4 , 3, 6, 7, 8, 10, 5, 9, 13, 11, 12