Biểu diễn đồ thị bằng ma trận

Một phần của tài liệu (LUẬN văn THẠC sĩ) các bài toán cơ bản của lý thuyết tổ hợp 13 (Trang 118)

4 Bài toán tối ưu

4.2 Bài toán tối ưu trong đồ thị

4.2.2 Biểu diễn đồ thị bằng ma trận

Biểu diễn đồ thị trên mặt phẳng là một biểu diễn cho phép ta nhìn nhận đối tượng này khá trực quan. Tuy nhiên ta vẫn cần tới các cách biểu diễn khác nhau của đồ thị để đáp ứng các đòi hỏi khác nhau của các ứng dụng. Chẳng hạn để chạy các phương trình giải quyết các bài tốn tối ưu trên đồ thị ta cần tới biểu diễn đồ thị trong bộ nhớ của máy tính. Một trong các cách biểu diễn đó là phương pháp sử dụng ma trận.

a) Biểu diễn một đồ thị bằng ma trận kề

Giả sử G = (V;E) là một đồ thị có hướng với V = {v1;v2;· · · ;vn}. Khi đó ma trận kề của đồ thị G là ma trận: A = (aij)n.n =    a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ...

an1 an2 . . . ann

   Ở đây: aij = 1 nếu (vi;vj) ∈ E 0 nếu (vi;vj) ∈/ E

Dễ thấy ma trận kề A của đồ thị có hướng G hồn tồn xác định G. Vì

vậy, ma trận kề A được coi là một biểu diễn của G.

Ví dụ 4.8. Giả sử G = (V;E) với V = {v1;v2;v3;v4;v5;v6} và E =

{e1;e2;· · · ;e10} là đồ thị có hướng được biểu diễn bằng hình trên. Khi đó ma trận kề của G là ma trận: A =       0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1      

b) Biểu diễn một đồ thị bằng ma trận liên thuộc

Giả sử G = (V;E) là đồ thị có hướng với V = {v1;v2;· · · ;vn} và

E = {e1;e2;· · · ;em}. Khi đó ma trận liên thuộc của đồ thị G là ma trận: B = (bij)n.m =    b11 b12 . . . b1m b21 a22 . . . b2m ... ... . . . ... bn1 bn2 . . . bnm    Ở đây: bij =   

1 nếu vi là đỉnh đầu cuả ej

−1 nếu vi là đỉnh cuối nhưng không là đỉnh đầu của ej 0 nếu vi không liên thuộc với ej

Ma trận liên thuộc B cũng hoàn toàn xác định đồ thị có hướng G. Vì vậy B cũng được coi là một biểu diễn của G.

Ví dụ 4.9. Giả sử G = (V;E) là đồ thị có hướng cho ở hình vextrene. Khi đó ma trận liên thuộc của G là ma trận:

B =       1 1 0 0 0 0 0 −1 −1 0 −1 0 1 1 0 0 0 0 0 0 0 −1 0 0 −1 0 0 0 0 0 0 0 0 0 1 −1 0 0 0 0 0 0 0 −1 0 1 −1 1 0 0 0 0 0 0 0 0 1 0 1 1       b) Biểu diễn một đồ thị bằng ma trận trọng số

Giả sử G = (V;E;f;g) là một đồ thị có hướng có trọng số. Ở đây, V =

{V = v1;v2;· · · ;vn} còn f : V −→ Wv và g : E −→ WE. Khi đó G được biểu diễn bằng ma trận trọng số cung C và ma trận trọng số đỉnh D. Ma

trận trọng số cung C của G là ma trận: C = (cij)n.n =    c11 c12 . . . c1n c21 c22 . . . c2n ... ... . . . ... cn1 cn2 . . . cnn    Ở đây: cij =    g(vi;vj) nếu (vi;vj) ∈ E 0 nếu i = j và (vi;vj) ∈/ E ∞ nếu i 6= j và (vi;vj) ∈/ E Ví dụ 4.10.

Giả sử G = (V;E;g) là đồ thị có trọng số có hướng được biểu diễn trên hình trên. Khi đó G được biểu diễn bằng ma trận:

B =       0 5 ∞ ∞ ∞ ∞ ∞ 0 ∞ 3 ∞ ∞ 7 4 0 ∞ 4 ∞ ∞ ∞ 6 0 ∞ 8 ∞ ∞ ∞ 2 0 ∞ ∞ ∞ ∞ ∞ 1 0      

4.2.3 Bài tốn tìm cây bao trùm có trọng số nhỏ nhất

Giả sử G = (V;E) là một đồ thị vơ hướng liên thơng. Khi đó đồ thị con T = (V0;E0) của G được gọi là cây bao trùm của G nếu T là cây và

V0 = V.

Tương tự, giả sựG= (V;E)là một đồ thị vơ hướng bất kì,G1;G2;· · · ;Gk

là các thành phần liên thơng của G và T1;T2;· · · ;Tk tương ứng là các cây bao trùm củaG1;G2;· · · ;Gk. Khi đó rừng bao gồm các cây T1;T2;· · · ;Tk

được gọi là rừng bao trùm của G.

Bây giờ giả sử G = (V;E;w) là một đồ thị vơ hướng có trọng số liên thơng, ở đây w : E −→ R là hàm trọng lượng cạnh với giá trị là các số thực. Với mỗi cây bao trùm T = (V;E0) của đồ thị có trọng số G, ta định

nghĩa trọng số của cây T, kí hiệu là w(T) là giá trị:

w(T) = X

l∈E0 w(l)

Bài tốn tìm cây bao trùm có trọng số nhỏ nhất: Cho đồ thị có trọng số

G= (V;E;w) như đã nói ở trên. Hãy tìm một cây bao trùm T = (V;E0)

của G sao cho trọng số w(T) của cây T là nhỏ nhất trong số các trọng số của các cây bao trùm của G.

a) Thuật toán Kruskal

Thuật toán: Giả sử G= (V;E;w) là đồ thị trọng số vô hướng liên thông với w : E −→ R

Bước 1: Xuất phát thuật toán từ đồ thị con T = (V0;E0) với V0 := V;E0 := E. Mỗi thành phần liên thông của đồ thị T xuất phát này chỉ bao gồm một đỉnh.

Bước 2: Sắp xếp các cạnh của trọng đồ G thành dãy S theo thứ tự không giảm của trọng lượng của các cạnh đó.

Bước 3: Lấy cạnh đầu tiên của dãy S chẳng hạn đó là cạnh e = xy, ta xét:

Nếu hai đỉnh đầu mút x và y của e thuộc hai thành phần liên thông khác nhau C1 và C2 của T thì S = S\ {e};E0 = E0 ∪ {e} và ta nhập C1 với

C2 thành một thành phần liên thông của đồ thị T mới nhận được. Ngược lại, S := S\ {e};E := E0 và các thành phần liên thông của T không thay đổi.

nếu T đã thành đồ thị liên thơng thì ta dừng thuật tốn. Khi đó đồ thị

T = (V0;E0) nhận được chính là một cây bao trùm có trọng số nhỏ nhất của đồ thị G.

Định lý 4.5. Với mọi đồ thị vơ hướng có trọng số G = (V;E;w), trong

đó w : E −→ R. Thuật tốn Kruskal ln tìm được một cây bao trùm có

trọng số nhỏ nhất của G.

Ví dụ 4.11. Bài tốn: Sử dụng thuật tốn Kruskal hãy tìm một cây bao trùm có trọng số nhỏ nhất của đồ thị có trọng số G = (V;E;w) được biểu diễn bởi hình:

Lời giải. Bước 1:

V0 := {s;a;b;c;d;e;f;t} E0 := d

T := {V0;E0}

C := {{s};{a};{b};{c};{d};{e};{f};t}

C là tập các thành phần liên thông củaT

Bước 2: Sắp xếp các cạnh của G thành dãy S theo thứ tự không giảm của trọng lượng: S := {ed;ae;ad;be;ab;bc;ec;ef;cf;dt;sa;sb;sc;f t;et}

Bước 3: Lấy cạnh đầu tiên của dãy S là cạnh ed ra xét. Vì ed có các đỉnh đầu mút e và d thuộc các thành phần liên thông khác nhau của T nên:

S := S\ {ed} = {ae;ad;· · · }

E0 := E0 ∪ {ed}= {ed}

Bước 4:T không liên thông ta phải quay lại bước 3. Bước 3: Lấy cạnh đầu

tiên của dãy S là cạnh ae ra xét. Ta thấy cạnh ae có các đỉnh đầu mút a

và e thuộc các thành phần liên thơng khác nhau của T. Vì vậy:

S := S\ {ae} = {ad;be;· · · }

E0 := E0 ∪ {ae}= {ed;ae}

C := {{s};{a;d;e};{b};{c};{f};{t}}

Bước 4: T không liên thông, ta quay lại bước 3.

Bước 3: Lấy cạnh đầu tiên của dãy S là cạnh ad ra xét. Ta thấy cạnh ad

có hai đỉnh đầu mút là a và d cùng thuộc một thành phần liên thơng là {a;d;e} của T, vì vậy:

S := S\ {ad} = {be;ab;· · · }

E0 := E0 = {ed;ae}

C := {{s};{a;d;e};{b};{c};{f};{t}}

Bước 4: T không liên thông. Ta phải quay lại bước 3.

Bước 3: Lấy cạnh đầu tiên của dãy là cạnh be ra xét. Ta thấy cạnh be có hai đỉnh đầu mút làb và e thuộc hai thành phần liên thơng khác nhau của

T, vì vậy:

S := S\ {be}= {ad;bc;· · · }

E0 := E0 ∪ {be} = {ed;ae;be}

C := {{s};{a;b;d;e};{c};{f};{t}} · · ·

Tiếp tục thực hiện thuật toán ta sẽ tới lần lặp cuối cùng như sau:

Bước 3: Lấy cạnh đầu tiên của dãy S là cạnh sa ra xét. Ta thấy cạnh sa

của T. Vì vậy:

S := S\ {sa}= {sb;sc;f t;ct}

E0 := E0∪ {sa} = {ed;ae;be;bc;ef;dt;sa} C := {{s;a;b;c;d;e;f;t}}

Bước 4: T liên thơng . Ta dừng thuật tốn và đồ thị T := (V0;E0) là cây bao trùm có trọng lượng nhỏ nhất của G, ở đây:

V0 = {s;a;b;c;d;e;f;t}

E0 := {ed;ea;be;bc;ef;dt;sa}

Nhận xét: Thuật toán Kruskal làm việc rất kém hiệu quả với các đồ thị trọng số có số cạnh lớn do phải chi phí nhiều thời gian để thực hiện việc sắp xếp các cạnh ở bước 2. Do vậy đối với các đồ thị có nhiều cạnh

người ta thường sử dụng thuật tốn Prim được mơ tả dưới đây.

b) Thuật toán Prim

Thuật toán: Giả sử G = (V;E;w) là một đồ thị có trọng số liên thơng với

w : E −→ R. Ta định nghĩa nhãn của đỉnh v ∈ V và bộ [α(v);β(v)] với

α(v) ∈ V và β(v) ∈ R. Nhãn của đỉnh v sẽ được lưu giữ như là giá trị của biến v và có thể thay đổi.

Bước 1: Khởi tạo và gán giá trị ban đầu cho các biến.

V0 := V (biến V0 chứa tất cả các đỉnh của cây bao trùm)

x := s (s là một đỉnh bất kì của V)

E0 := ∅ ( biến E0 chứa tất cả các cạnh của cây bao trùm cần tìm)

U := V\ {s}

y := [s;∞] cho mọi y ∈ U

Bước 2: Đổi nhãn cho các đỉnh thuộc U. Với mọi đỉnh y ∈ U ta có:

y = { Bước 3: Tìm min

y∈U β(y) = β(vi) (*)

Bước 4: x := vi(nếu có một số đỉnh vi ∈ U thỏa mãn (*) thì ta chọn một đỉnh bất kì trong số các đỉnh đó)

Bước 5: Gán giá trị mới cho các biến E0 và U:

E0 := E0∪ {xα(x)}

U := U\ {x}

Bước 6: Nếu U 6= ∅ thì ta quay lại bước 2.

Nếu U = ∅ thì ta dừng thuật tốn và đồ thị T = (V0;E0) là một cây bao trùm có trọng lượng nhỏ nhất của đồ thị có trọng số G.

Định lý 4.6. Với mọi đồ thị có trọng số vơ hướng liên thơngG= (V;E;w),

trong đó w : E −→ R, thuật tốn Prim ln tìm được một cây bao trùm

có trọng số nhỏ nhất của G.

Ví dụ 4.12. Bài tốn: Tìm cây bao trùm có trọng số nhỏ nhất của đồ thị có trọng số G = (V;E;w) bằng thuật toán Prim.

Lời giải. Bước 1:

V0 := {s;a;b;c;d;e;f;t} x := s E0 := ∅ U := {a;b;c;d;e;f;t} y := [s;∞]cho mọi y ∈ U Lần lặp 1 Bước 2: a := [s; 5] ;b := [s; 5] ;c := [s; 6] ;d := [s;∅] ;e := [s;∅] ;f := [s;∅] ;t := [s;∅] Bước 3: min

y∈U β(y) =β(a) =β(b) = 5

Bước 4: x := a

Bước 5: E0 := E0 ∪ {as} = {as};U := U\ {a}= {b;c;d;e;f;t}

Bước 6: U 6= ∅. Ta phải quay lại bước 2.

Lần lặp 2

Bước 2:b := [a; 2] ;c := [s; 6] ;d := [a; 1] ;e := [a; 1] ;f := [s;∅] ;t:= [s;∅] Bước 3: min

y∈U β(y) = β(d) = β(e) = 1

Bước 4: x := d

Bước 5: E0 := E0 ∪ {da}= {as;da};U := U\ {d} = {b;c;e;f;t}

Lần lặp 3

Bước 2:b := [a; 2] ;c := [s; 6] ;e := [d;−2] ;f := [s;∅] ;t := [d; 5]

Bước 3: min

y∈U β(y) =β(e) = −2 Bước 4: x := e

Bước 5: E0 := E0 ∪ {ed} = {as;da;ed};U := U\ {e}= {b;c;f;t}

Bước 6: U 6= ∅. Ta phải quay lại bước 2.

Lần lặp 4

Bước 2:b := [a; 2] ;c := [e; 3] ;f := [e; 3] ;t := [d; 5]

Bước 3: min

y∈U β(y) =β(b) = 2

Bước 4: x := b

Bước 5: E0 := E0 ∪ {ba}= {as;da;ed;ba};U := U\ {b}= {c;f;t}

Bước 6: U 6= ∅. Ta phải quay lại bước 2.

Lần lặp 5:

Bước 2:c := [b; 2] ;f := [e; 3] ;t:= [d; 5]

Bước 3: min

y∈U β(y) =β(c) = 2

Bước 4: x := c

Bước 5: E0 := E0 ∪ {cb}= {as;da;ed;ba;cb};U := U\ {c} = {f;t}

Bước 6: U 6= ∅. Ta phải quay lại bước 2.

Lần lặp 6:

Bước 2:f := [e; 3] ;t:= [d; 5]

Bước 3: min

y∈U β(y) =β(f) = 3

Bước 4: x := f

Bước 5: E0 := E0 ∪ {f e} = {as;da;ed;ba;cb;f e};U := U\ {f} = {t} Bước 6: U 6= ∅. Ta phải quay lại bước 2.

Lần lặp 7:

Bước 2:t := [d; 5]

Bước 3: min

y∈U β(y) =β(t) = 5

Bước 4: x := t

Bước 5: E0 := E0 ∪ {td} = {as;da;ed;ba;cb;f e;td};U := U\ {t} = ∅ Bước 6: U = ∅. Ta dừng thuật toán và đồ thị T = (V0;E0) với V0 =

{s;a;b;c;d;e;f;t} và E0 = {;da;ed;ba;cb;f e;td} là cây bao trùm có trọng số nhỏ nhất của G. Cùng một đồ thị nhưng hai cây bao trùm thực

hiện bằng thuật toán Kruskal và Prim là khác nhau. Nhưng hai cây bao trùm này đều có trọng lượng nhỏ nhất.

4.2.4 Bài tốn tìm đường đi có trọng số nhỏ nhất

Giả sử G = (V;E;w) là một đồ thị có trọng số liên thơng, có hướng, khơng có khuyên, ở đây: w : E −→ R+ ∪ 0 = {r ∈ R/r > 0}. Giả sử s;t ∈ V là hai đỉnh đã cho và P là một đường có hướng với đỉnh đầu là s

và đỉnh cuối là t. Ta định nghĩa trọng số của đường P, kí hiệu là w(P) là giá trị:

w(P) = X

e là cung của P

w(e)

Bài tốn tìm đường có trọng lượng nhỏ nhất:

Giả sử G= (V;E;w) là đồ thị có trọng số, liên thơng, có hướng khơng có khuyên với w : E −→ R+ ∪ {0}. Ta cũng giả sử s ∈ V là một đỉnh cho trước và D ⊆ V là một tập đỉnh cho trước. Với mỗi đỉnh d ∈ D, hãy tìm

một đường có hướng P đi từ tập s tới d sao cho trọng lượng w(P) của đường P là nhỏ nhất trong số tất cả trọng lượng của các đường có hướng đi từ s tới d và cho biết trọng lượng w(P) đó bằng bao nhiêu.

Để giải quyết bài toán này, Dijkstra đã đưa ra một thuật toán mà ngày nay ta gọi là thuật toán Dijkstra. Thuật tốn này về ngun tắc và hình thức rất giống với thuật tốn Prim trình bày ở trên.

Thuật tốn Dijkstra: Ta gọi nhãn của đỉnh v ∈ V là bộ [α(v);l(v)] với

α(v) ∈ V còn l(v) ∈ R+ ∪ {0}. Một đỉnh được gọi là có nhãn tạm thời nếu như nhãn của đỉnh đó cịn được xem xét và có thể bị thay đổi ở các bước tiếp theo của thuật toán. Nếu nhãn của một đỉnh không thay đổi ở tất cả các bước tiếp theo của thuật tốn, thì nó được gọi là nhãn cố định của đỉnh đó. Ta sẽ lưu giữ các đỉnh có nhãn tạm thời ở biến U. Ta cũng dùng một biến là L để lưu giữ nhãn cố định của các đỉnh. Nhãn của đỉnh

v sẽ được lưu giữ như là giá trị của biến v.

Bước 1: Khởi tạo và gán giá trị ban đầu cho các biến.

x := s (s là đỉnh đã cho trước trong bài toán)

D0 := D\ {s} (D là tập các đỉnh đã cho trước trong bài toán).

U := V\ {s}

y := [s;∞] cho mọi y ∈ U L := {s := [s; 0]}

Bước 2: Đổ nhãn cho các đỉnh thuộc U. Với mọi đỉnh y ∈ U y = {

Bước 3: Tìm min

y∈U l(y) =l(vi) (**)

Bước 4: x := vi(nếu có một số đỉnh vi ∈ U thỏa mãn (**) thì ta chọn một đỉnh bất kì trong số các đỉnh đó).

Bước 5: Gán giá trị mới cho các biến D0;U và L D0 := D0\ {x}

U := U\ {x}

L := L∪ {x := [α(x);l(x)]}

Bước 6: Nếu D0 6= 0 thì ta quay lại bước 2.

Nếu D0 = ∅ thì ta bắt đầu đi tìm đường có hướng có trọng lượng nhỏ nhất dựa vào tập L các nhãn cố định của các đỉnh của Gnhận được sau lần lặp cuối cùng. Khi đó, với mỗi đỉnh d ∈ D;l(d) là trọng lượng của đường có hướng có trọng số nhỏ nhất từ s tới d và một trong các đường đó là:

d ←α(d) ← α(α(d)) ← · · · ← s

Một phần của tài liệu (LUẬN văn THẠC sĩ) các bài toán cơ bản của lý thuyết tổ hợp 13 (Trang 118)

Tải bản đầy đủ (PDF)

(132 trang)