CHƯƠNG 6

GV: TRẦN QUỐC VIỆT

1

Giới thiệu 2 ứng dụng:

 Bài toán luồng cực đại (Max-flow

problem)

 Bài toán ghép cặp (Matching problem)

2

3

 Mạng (network) là một đồ thị có hướng có trọng số G = (V,E) trên đó ta chọn một đỉnh gọi là đỉnh phát (source vertex) và 1 đỉnh gọi là đỉnh thu (sink vertex).

Ví dụ

3

5 5

sink

source

2 2 6

8 4 4

4

3

 Một mạng G = (V,E) với đỉnh phát là a, đỉnh thu là z, c(e)  N là trọng số của cung e. Với mỗi đỉnh x, ta đặt: = {e  E | e tới trong x} In(x) Out(x) = {e  E | e tới ngoài x}

b 3 d

5 5 In(c)={ac, bc}

z

a

2 2 6

Out(c)={cd, ce}

8 4 4

5

c 3 e

 Một hàm tải (flow function) trên G được định nghĩa bởi ánh xạ:

φ: E  N

thỏa các điều kiện

(i) 0 ≤ φ(e) ≤ c(e), e  E (Giới hạn của luồng)

(i) φ(e) = 0, e  In(a)  Out(z) (Giá trị luồng)

(e)

(e)

za, 

 

 \Vx , (iii) (Cân bằngluồng)

 e

In(x)

 e

Out(x)

6

b d 3,1 c[u,v]/f[u,v]

5,4 5,4 2,1

z

a

2,1 6,2

4,1

8,2

4,1

4,0 3,1 (2,0) c e

3,0 1,0

g

7

(fa) = 0 (zg) = 0 (ab) = 4 (ac) = 1 (fc) = 0 (gc) = 0 (bd) = 1 (be) = 1 (bc) = 2 (cd) = 2 (ce)=1 (dz) = 4 (ez) = 1 (ed) = 1

f

 Một phép cắt (cut) xác định bởi 1 tập hợp con P của V,

P ký hiệu (P, ) là tập hợp:

}

P (P, ) = {

x|xy

vàP

 Py

P\VP 

Trong đó

)P(P,

gọi là 1 phép cắt a-z nếu aP và

Phép cắt P

z

Trọng số (capacity) của một phép cắt được định

nghĩa là:

c(P,

)P

c(e)

8

e 

)P(P,

b 3 d

5 5

z

a

2 2 6

 P={a,b, c}

8 4 4

 P={d, e,z}

 (P,P)={bd,be,cd,ce}

 c(P,P)=16

9

c 3 e

Gọi  là một hàm tải trên mạng G và P  V\{a,z}

thì:

(e)

(e)

e 

)P(P,

P),P(e 

d b

P

Ví dụ: 3,1

5,4 5,4 2,1

z

a

2,1 6,2

4,1

8,2

4,1

4,0 3,1 (2,0) c e

g

3,0 1,0

10

f

lượng tải vào z, nghĩa là:

(e)

(e)

 Với mọi hàm tải φ trên mạng G, lượng tải khỏi a bằng 

 Out(a)

e 

e 

In(z)

d b 3,1

5,4 5,4 2,1

z

a

2,1 6,2

4,1

8,2

4,1

4,0 (2,0) 3,1 c e

g

1,0 3,0

11

f

 Đặt P = V \ {a,z}, khi đó:

(e)

(e)

(e)

(e)

 Out(a)

e 

e 

In(z)

P),P(e 

e 

)P(P,

12

 Với mọi hàm tải φ và với mọi phép cắt a-z trong mạng

G, ta có:

|

 |

c(P,

)P

13

 Thêm vào G một đỉnh a0 và cạnh a0a (hướng từ a0 đến a), c(a0a)=. Ta được mạng G’. Trong G’ đặt ’(a0a) = |  | và  ’(e) = (e), eE Ta có:

|

 |   |' |

(e)

 ' P)},

 P(e

{a

 ' (e) }) {a

 e

P(P,

0

0

(e)

c(e)

c(P,

)P

 e

)P(P,

 e

)P(P,

14

 Với mọi hàm tải φ và mọi phép cắt a-z trong mạng G.

c(P,

)P

|φ|= nếu và chỉ nếu thỏa 2 điều kiện:

 e

,P(

P),

(e)

0

 e

(P,

),P

(e)

c(e)

(i) (ii)

|

 |

c(P,

)P

 Khi thì  là hàm tải có tải trọng lớn nhất và là phép cắt a-z có trọng số nhỏ nhất

(P,

)P

15

với một phép căt a-z

 Cho một mạng G, đỉnh phát a và đỉnh thu z, (

)PP,

 Một chuyền a-z K là một đường đi vô hướng

nối a với z

 Ký hiệu s(e) = c(e)-(e) gọi là độ lệch tải của e  Ta định nghĩa:

: e K

)e(K

: e K và có hướng từ a đến z

      - 

16

: e K và e có hướng từ z đến a

Input: Mạng G, đỉnh phát a và đỉnh thu z Output: Tập P của phép cắt a-z tối thiểu

(P,

)P

Bắt đầu bằng 1 hàm tải  bất kỳ trên G 1. Đánh dấu mọi đỉnh đều chưa xét, gán nhãn cho a là (-,(a)) với (a)=. Đặt p0=a. 2. Xét p0.

a. Cạnh e=p0q với q chưa có nhãn và s(e)>0 thì gán nhãn

cho q là (p0

+, min((p0), s(e)))

b. Cạnh e=qp0 với q chưa có nhãn và (e)>0 thì gán nhãn

cho q là (p0

-, min((p0), (e)))

3. Nếu đỉnh z đã được gán nhãn  4, ngược lại  5. 4. Xác định một dây chuyền (vô hướng) từ a đến z dựa vào thành phần thứ 1 của nhãn. Cập nhật lại  như sau: (e) = (e) + (z)  K(e). Về bước 1.

5. Tìm 1 đỉnh p đã có nhãn nhưng chưa xét. Nếu tồn

tại p, đặt p0 = p,  bước 2. Ngược lại dừng.

 Sau khi thuật toán kết thúc. P là tập hợp các

đỉnh đã có nhãn và đã xét.

19

G với hàm tải ban đầu:

b 6,5 d

6,6 5,5 3,0

z

a

3,1

6,1 5,2

20

c e 1,1

Lặp lần 1:

Gán nhãn cho đỉnh a là (-,(a)), với (a)=∞ Đặt p0=a

b 6,5 d

6,6 5,5 3,0

z

3,1

(-,∞) a

6,1 5,2

21

c e 1,1

Xét các đỉnh kề với p0: Cạnh e1=(a,b) có s(e1)=0 nên không xét Cạnh e2=(a,c) có s(e2)=3>0 nên gán nhãn cho đỉnh c là: (a+,min{(p0),s(e2)}) =(a+,3)

b 6,5 d

6,6 5,5 3,0

z

3,1

(-,∞) a

6,1 5,2

Đỉnh z chưa được gán nhãn, đỉnh c đã gán nhãn nhưng chưa xét, đặt p0=c

22

e 1,1 c (a+,3)

Xét các đỉnh kề với p0: Cạnh e3=(c,e) có s(e3)=0 nên không xét Cạnh e4=(c,d) có s(e4)=2>0 nên gán nhãn cho đỉnh d là: (c+,min{(p0),s(e4)}) =(c+,2)

(c+,2) b 6,5 d

6,6 5,5 3,0

z

3,1

(-,∞) a

6,1 5,2

Đỉnh z chưa được gán nhãn, đỉnh d đã gán nhãn nhưng chưa xét, đặt p0=d

23

e 1,1 c (a+,3)

p0=d: Cạnh e5=(d,z) có s(e5)=0 nên không xét Cạnh e6=(b,d) có (e6)=5>0 nên gán nhãn cho đỉnh b là: (d-,min{(p0), (e6)}) =(d-,2)

b 6,5 d (d-,2)

(c+,2) P0 6,6 5,5 3,0

z

3,1

(-,∞) a

6,1 5,2

Đỉnh z chưa được gán nhãn, đỉnh b đã gán nhãn nhưng chưa xét, đặt p0=b

24

e 1,1 c (a+,3)

p0=b: Cạnh e7=(b,e) có s(e7)=3>0 nên gán nhãn cho đỉnh e là: (b+,min{(p0), s(e7)}) =(b+,2)

(c+,2) b 6,5 d (d-,2) p0

6,6 5,5 3,0

z

3,1

(-,∞) a

6,1 5,2

Đỉnh z chưa được gán nhãn, đỉnh e đã gán nhãn nhưng chưa xét, đặt p0=e

25

(b+,2) e 1,1 c (a+,3)

p0=e: Cạnh e8=(e,z) có s(e8)=5>0 nên gán nhãn cho đỉnh z là: (e+,min{(p0), s(e8)}) =(e+,2)

(c+,2) b 6,5 d (d-,2)

6,6 5,5 3,0

3,1

z (e+,2)

(-,∞) a

6,1 5,2

(b+,2)

Đỉnh z đã được gán nhãn, tìm chuyền a-z K: acdbez

26

e 1,1 c (a+,3)

Cập nhật lại hàm tải:  = +(z)K

: e K

)e(K

: e K và có hướng từ a đến z

      - 

: e K và e có hướng từ z đến a

6,3 b d

6,6 5,5 3,2

z

a

3,3

(e+,2)

6,3 5,4

27

c e (1,1)

Lặp lần 2:

 Gán nhãn cho đỉnh a là (-,(a)), với (a)=∞  Đặt p0=a

6,3 b d

6,6 5,5 3,2

z

3,3

a (-,∞)

p0

6,3 5,4

28

c e (1,1)

Lặp lần 2:

 Gán nhãn cho đỉnh a là (-,(a)), với (a)=∞  Đặt p0=a

6,3 b d

6,6 5,5 3,2

z

3,3

a (-,∞)

p0

6,3 5,4

 Đỉnh z chưa gán nhãn, đỉnh c đã gán nhãn nhưng chưa

được xét, đặt p0=c

29

c e (1,1) (a+,1)

b 6,5 d

6,6 5,5 3,0

z

a

3,1

6,1 5,2

c 1,1 e b 6,5 d

6,6 5,5 3,0

z

a

3,1

6,1 5,2

30

c 1,1 e

 Khi kết thúc thuật toán Ford-Fulkerson thì φ là 1 hàm

tải tối đại và

là 1 phép cắt a-z tối tiểu.

)P(P,

31

 Trong một mạng G, tải trọng của 1 hàm tải tối đại

bằng trọng số của một phép cắt a-z tối tiểu.

32

6,5

B D

6,6 5,5

3,0 3,1

A Z

5,2 6,1

33

C E 1,1

6,3

B D

6,6 5,5

3,2 3,3

A Z

5,4 6,3

34

C E 1,1

7

B E

4 6 5 4

A C Z

4

3

5 7 12

35

D F 9

7,5

B E

4,4 6,5 5 4,1

A C Z

4,4

3,3

5,2 7,7 12,12

36

D F 9,9

 Cho một đồ thị lưỡng phân G = (X,Y,E) với X là tập hợp các đỉnh trái và Y là tập hợp các đỉnh phải của G. Một bộ ghép (matching) của G là một tập hợp các cạnh của G đôi một không có đỉnh chung. Bài toán cặp ghép (matching problem) của G là tìm một bộ ghép tối đại (có số lượng các cạnh là lớn nhất) của G.

37

 Xét 1 bộ ghép M của G. Khi đó:

◦ Các đỉnh trong M được gọi là các đỉnh đã được

ghép.

◦ Một đường pha (alternating path) là một đường

trong G bắt đầu bằng 1 đỉnh chưa ghép thuộc X và các cạnh lần lượt là thuộc rồi không thuộc M.

◦ Một đường mở (augmenting path) là 1 đường pha

kết thúc bằng một đỉnh chưa ghép thuộc Y.

38

◦ Từ 1 đỉnh u chưa ghép thuộc X, ta có thể xây

dựng 1 cây pha (alternating tree) gốc u gồm tất cả các đường pha bắt đầu từ u.

◦ Một cây pha chứa ít nhất 1 đường mở được gọi

là 1 cây mở (augmenting tree). Ngược lại sẽ được gọi là một cây đóng (Hungarian tree), gốc u của cây đóng này gọi là đỉnh đóng (Hungarian acorn).

39

1. Đặt mọi đỉnh thuộc X là chưa kiểm tra. Đặt M=. 2. Nếu mọi đỉnh thuộc X chưa ghép đều đã kiểm tra thì dừng. Nếu không, chọn một đỉnh uX chưa ghép và chưa kiểm tra để xây dựng 1 cây pha gốc u.

3. Nếu cây pha này là cây mở thì  bước 4. Nếu không, đánh dấu u là đã kiểm tra  bước 2. 4. Mở rộng M bằng cây mở như sau: Trên đường mở, loại bỏ các cạnh trong M và thêm vào các cạnh ngoài M. Đánh dấu mọi đỉnh thuộc X là chưa kiểm tra. Quay về bước 2.

40

 Bộ ghép nhận được sau khi áp dụng thuật

toán Hungarian vào đồ thị lưỡng phân G là tối đại.

41

 Một bộ ghép M của đồ thị lưỡng phân

G=(X,Y,E) được gọi là X-đầy đủ (X-complete matching) nếu M chứa mọi đỉnh của X. Với AX, đặt (A) là tập hợp các đỉnh yY kề với một đỉnh xA. Khi này, G có 1 bộ ghép X-đầy đủ nếu và chỉ nếu AX, |(A)||A|.

42

A a

B b

C c

D d

E e

F f

G g

43

H h

A a

B b

C c

D d

E e

F f

G g

44

H h