Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa
Bài toỏn ghộp cặp trờn đồ thị
Giả sử G=(V,E) là đồ thị vô hớng, trong đó mỗi cạnh (v,w) đợc gán với một số thực c(v,w) gọi là trọng số của nó.
Định nghĩa. Cặp ghép M trên đồ thị G là tập các cạnh của đồ thị trong đó không có hai cạnh nào có đỉnh chung.
Số cạnh trong M - kích thớc,
Tổng trọng số của các cạnh trong M - trọng lợng của cặp ghép.
Cặp ghép với kích thớc lớn nhất đợc gọi là cặp ghép cực đại.
Cặp ghép với trọng lợng lớn nhất đợc gọi là cặp ghép lớn nhất.
Cặp ghép đợc gọi là đầy đủ (hoàn hảo) nếu mỗi đỉnh của đồ thị là đầu mút của ít nhất một cạnh trong cặp ghép.
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa
Bài toỏn ghộp cặp
Graph Matching
1
Graph Matching
Bài toỏn ghộp cặp trờn đồ thị
Gi ả sử G =( V,E ) là đ ồ thị vô hướng , trong đó mỗi cạnh ( v,w ) đư ợc gán với một số thực c ( v,w ) gọi là trọng số của nó .
Đ ịnh nghĩa . Cặp ghép M trên đ ồ thị G là tập các cạnh của đ ồ thị trong đ ó không có hai cạnh nào có đ ỉnh chung .
Số cạnh trong M - kích thước ,
Tổng trọng số của các cạnh trong M - trọng lượng của cặp ghép .
Cặp ghép với kích thước lớn nhất đư ợc gọi là cặp ghép cực đại.
Cặp ghép với trọng lượng lớn nhất đư ợc gọi là cặp ghép lớn nhất .
Cặp ghép đư ợc gọi là đ ầy đủ ( hoàn hảo ) nếu mỗi đ ỉnh của đ ồ thị là đ ầu mút của ít nhất một cạnh trong cặp ghép .
2
Graph Matching
Hai bài toỏn
Bài toán cặp ghép cực đại : Tìm cặp ghép với kích thước lớn nhất trong đ ồ thị G.
Bài toán cặp ghép lớn nhất : Tìm cặp ghép với trọng lượng lớn nhất trong đ ồ thị G.
Ta hạn chế xét các bài toán đ ặt ra trên đ ồ thị hai phía G = ( X Y, E ) .
3
Graph Matching
Vớ dụ
Cặp ghộp cực đại Cặp ghộp khụng là cặp ghộp
Cặp ghộp Cặp ghộp hoàn hảo
4
Graph Matching
Vớ dụ
Cặp ghộp lớn nhất :
M = {( x 1 , y 1 ), ( x 2 , y 3 ), ( x 3 , y 2 ), ( x 4 , y 4 )}
Cú trọng lượng 29.
y 4
y 3
y 2
y 1
x 4
x 3
x 2
x 1
12
3
4
8
3
2
4
6
5
Graph Matching
Bài toán cặp ghép cực đại trên đ ồ thị hai phía
Xét đ ồ thị hai phía G = ( X Y, E ) .
Cặp ghép là tập cạnh mà không có hai cạnh nào có chung đ ỉnh
Bài toán : Tìm cặp ghép kích thước lớn nhất
1
2
3
4
5
6
7
8
9
10
6
Graph Matching
Qui về Bài toán luồng cực đại
1
2
3
4
5
6
7
8
9
10
s
t
Mỗi cung (s, i) cú kntq 1.
Mỗi cung (j, t) cú kntq 1.
Mỗi cạnh được thay thế bởi cung cú kntq 1.
7
Graph Matching
Tỡm luồng cực đại
Luồng cực đại từ s->t cú giỏ trị 4.
Cặp ghộp cực đại cú kớch thước 4.
1
2
3
4
5
6
7
8
9
10
s
t
8
Graph Matching
Bài toán cặp ghép cực đại trên đ ồ thị hai phía
Gi ả sử M là một cặp ghép trên G .
Nếu cạnh e = ( x, y ) M , ta nói e là cạnh của cặp ghép (hay cạnh đ ậm ) và các đ ỉnh x, y là các đ ỉnh đ ậm (hay không tự do).
Nếu cạnh e = ( x, y ) M , th ì ta nói e là cạnh nhạt còn các đ ỉnh x, y là các đ ỉnh nhạt (hay tự do).
9
Graph Matching
Đường tăng cặp ghộp
Một đư ờng đi trên đ ồ thị G mà trong đ ó hai cạnh liên tiếp là không cùng đ ậm hay nhạt sẽ đư ợc gọi là đư ờng đi luân phiên đậm/nhạt ( hay gọi ngắn gọn là đư ờng đi luân phiên ) .
Đư ờng đi luân phiên bắt đ ầu từ một đ ỉnh tự do thuộc tập X và kết thúc ở một đ ỉnh tự do thuộc tập Y đư ợc gọi là đư ờng tăng cặp ghép .
10
Graph Matching
Định lý Berge
Đ ịnh lý 1 (Berge C). Cặp ghép M là cực đại khi và chỉ khi không tìm đư ợc đư ờng tăng cặp ghép .
CM :
Đ iều kiện cần . Bằng phản chứng . Gi ả sử M là cặp ghép cực đại nhưng vẫn tìm đư ợc đư ờng tăng cặp ghép
P x 0 , y 1 , x 1 , y 2 , ..., x k , y 0
trong đ ó x 0 và y 0 là các đ ỉnh tự do.
Gọi E P là tập các cạnh của đ ồ thị nằm trên đư ờng đi P
E P = { ( x 0 ,y 1 ) , ( y 1 , x 1 ) , ..., ( x k , y 0 ) } .
Dễ thấy số lượng cạnh nhạt trong E P là bằng số lượng cạnh đ ậm của nó cộng với 1 . Để đơn giản trong phần dưới đây ta đ ồng nhất ký hiệu đư ờng đi P với tập cạnh E P của nó . Xây dựng cặp ghép M’ theo qui tắc:
M’ = ( M P ) \ ( M P ) .
Dễ thấy M’ cũng là cặp ghép và rõ ràng | M’ | = | M | + 1 . Mâu thuẫn thu đư ợc đã chứng minh đ iều kiện cần .
11
Graph Matching
Định lý Berge
Đ iều kiện đủ. Gi ả sử cặp ghép M chưa là cặp ghép cực đại. Gọi M * là cặp ghép cực đại. Xét đ ồ thị G ’ = ( V , M M *). Rõ ràng hai cạnh liên tiếp trong mỗi đư ờng đi cũng nh ư mỗi chu trình trong G’ không thể thuộc cùng một cặp ghép M hoặc M *. Vì vậy , mỗi đư ờng đi cũng nh ư mỗi chu trình trong G ’ đ ều là đư ờng luân phiên M / M *. Do | M *| > | M |, nên rõ ràng là luôn tìm đư ợc ít nhất một đư ờng đi luân phiên M / M * mà trong đ ó số lượng cạnh thuộc M * là lớn hơn số lượng cạnh thuộc M. Đư ờng đi đ ó chính là đư ờng tăng cặp ghép trên đ ồ thị G .
Đ ịnh lý đư ợc chứng minh .
Chú ý: Trong chứng minh đ ịnh lý ta không sử dụng tính hai phía của G . Do đ ó , Đ ịnh lý 1 là đ úng với đ ồ thị vô hướng bất kỳ .
12
Graph Matching
Thuật toán tìm cặp ghép cực đại
Đ ầu vào : Đ ồ thị vô hướng G = ( V, E ).
Bước khởi tạo. Xây dựng cặp ghép M trong đ ồ thị G ( có thể bắt đ ầu từ M = ).
Bước lặp .
Kiểm tra tiêu chuẩn tối ưu: Nếu đ ồ thị G không chứa đư ờng tăng cặp ghép th ì M là cặp ghép cực đại, thuật toán kết thúc .
Ngược lại, gọi P là một đư ờng tăng cặp ghép xuất phát từ đ ỉnh tự do x 0 X , kết thúc ở đ ỉnh tự do y 0 Y . Tăng cặp ghép theo qui tắc
M := ( M P ) \ ( M P ),
rồi lặp lại bước lặp .
13
Graph Matching
Tỡm đường tăng
Từ đ ồ thị G ta xây dựng đ ồ thị có hướng G M = ( X Y , E M ) với tập cung E M đư ợc bằng cách đ ịnh hướng lại các cạnh của G theo quy tắc sau :
i) Nếu ( x,y ) M E , th ì ( y,x ) E M ;
ii) Nếu ( x,y ) E \ M , th ì ( x,y ) E M .
Đ ồ thị G M sẽ đư ợc gọi là đ ồ thị tăng cặp ghép .
Dễ thấy :
Đường tăng cặp ghép tương ứng với một đư ờng đi xuất phát từ một đ ỉnh tự do x 0 X kết thúc tại một đ ỉnh tự do y 0 Y trên đ ồ thị G M .
Ngược lại, một đư ờng đi trên đ ồ thị G M xuất phát từ một đ ỉnh tự do x 0 X kết thúc tại một đ ỉnh tự do y 0 Y sẽ tương ứng với một đư ờng tăng cặp ghép trên đ ồ thị G.
Vì vậy , để xét xem đ ồ thị G có chứa đư ờng tăng cặp ghép hay không , có thể thực hiện thuật toán tìm kiếm theo chiều rộng trên đ ồ thị G M bắt đ ầu từ các đ ỉnh tự do thuộc tập X .
14
Graph Matching
Thuật toỏn
Sử dụng cách tìm đư ờng tăng cặp ghép theo nhận xét vừa nêu , từ sơ đ ồ tổng quát dễ dàng xây dựng thuật toán để giải bài toán tìm cặp ghép cực đại trên đ ồ thị hai phía với thời gian tính O ( n 3 ), trong đ ó n = max (| X |, | Y |).
15
Graph Matching
Cài đặt
Cấu trỳc dữ liệu
Var
A : Array[1..100,1..100] of Byte; (* Ma trận kề của đồ thi hai phớa G *)
Truoc , (* Ghi nhận đường đi *)
Vo, (* Vo[x ]- đỉnh được ghộp với x X *)
Chong : Array[1..100] of Byte; (* Chong[y]-đỉnh được ghộp với y Y *)
N, x0, y0, Cnt : Byte;
Stop : Boolean;
(* Nếu (x, y) M thỡ Vo[x ]=y; Chong[y ]=x.
Vo[x ]=0 => x là đỉnh nhạt ; Chong[y ]=0 => y là đỉnh nhạt *)
16
Graph Matching
Tỡm đường tăng
Procedure Tim(x:Byte );
var y: Byte;
begin
For y:=1 to N do
If ( A[x,y ]=1)and(Truoc[y]=0)and(y0=0) then
begin
Truoc[y ]:=x;
If Chong[y ]0 then Tim(Chong[y ])
else
begin
y0:=y;
Exit;
end;
end;
end;
Procedure Tim_Duong_Tang ;
begin
Fillchar(Truoc,Sizeof(Truoc),0);
y0:=0;
For x0:=1 to N do
begin
If Vo[x0]=0 then Tim(x0);
If y00 then exit;
end;
Stop:=true;
end;
17
Graph Matching
Thủ tục MaxMatching
Procedure Tang;
var temp: Byte;
begin
Inc(Cnt );
While Truoc[y0]x0 do
begin
Chong[y0]:=Truoc[y0];
Temp:=Vo[Truoc[y0]];
Vo[Truoc[y0]]:=y0;
y0:=Temp;
end;
Chong[y0]:=x0;
Vo[x0]:=y0;
end;
Procedure MaxMatching ;
begin
Stop:=false;
Fillchar(Vo,Sizeof(Vo),0);
Fillchar(Chong,Sizeof(Chong),0);
Cnt :=0;
While not Stop do
begin
Tim_duong_tang ;
If not Stop then Tang;
end;
end;
18
Graph Matching
Bài toán phân công
Có n công việc và n thợ . Mỗi thợ đ ều có kh ả năng thực hiện tất cả các công việc . Biết
w ij - hiệu qu ả phân công thợ i làm việc j ,
( i, j = 1, 2,..., n ).
Cần tìm cách phân công thợ thực hiện các công việc sao cho mỗi thợ chỉ thực hiện một việc và mỗi việc chỉ do một thợ thực hiện , đ ồng thời tổng hiệu qu ả thực hiện các công việc là lớn nhất .
19
Graph Matching
Qui về bài toỏn cặp ghộp lớn nhất
Xây dựng đ ồ thị hai phía đ ầy đủ G = ( X Y , E )
X ={ x 1 , x 2 ,..., x n } tương ứng với các thợ ,
Y = { y 1 , y 2 ,..., y n }- tương ứng với các công việc .
Mỗi cạnh ( x i , y j ) đư ợc gán cho trọng số w ( x i , y j ) = w ij .
Khi đ ó trong ngôn ng ữ đ ồ thị , bài toán phân công có thể phát biểu nh ư sau : Tìm trong đ ồ thị G cặp ghép đ ầy đủ có tổng trọng số là lớn nhất . Cặp ghép nh ư vậy đư ợc gọi là cặp ghép tối ưu.
20
Graph Matching
Cơ sở thuật toán
Ta gọi một phép gán nhãn chấp nhận đư ợc cho các đ ỉnh của đ ồ thị G= ( X Y,E ) là một hàm số f xác đ ịnh trên tập đ ỉnh X Y: f: X Y R, tho ả mãn
f ( x ) + f ( y ) w ( x,y ) , x X, y Y.
Một phép gán nhãn chấp nhận đư ợc nh ư vậy dễ dàng có thể tìm đư ợc , chẳng hạn phép gán nhãn sau đây là chấp nhận đư ợc
f ( x ) = max { w ( x,y ): y Y }, x X ,
f ( y ) = 0 , y Y .
21
Graph Matching
Đồ thị cõn bằng
Gi ả sử có f là một phép gán nhãn chấp nhận đư ợc , ký hiệu
E f = {( x,y ) E : f ( x ) + f ( y ) = w ( x,y )}.
Ký hiệu G f là đ ồ thị con của G sinh bởi tập đ ỉnh X Y và tập cạnh E f . Ta sẽ gọi G f là đ ồ thị cân bằng .
22
Graph Matching
Tiờu chuẩn tối ưu
Đ ịnh lý 2. Gi ả sử f là phép gán nhãn chấp nhận đư ợc . Nếu G f chứa cặp ghép đ ầy đủ M*, th ì M* là cặp ghép tối ưu.
Chứng minh .
Gi ả sử G f chứa cặp ghép đ ầy đủ M *. Khi đ ó từ đ ịnh nghĩa G f suy ra M * cũng là cặp ghép đ ầy đủ của đ ồ thị G . Gọi w ( M *) là trọng lượng của M *:
Do mỗi cạnh e M * đ ều là cạnh của G f và mỗi đ ỉnh của G kề với đ úng một cạnh của M *, nên
Gi ả sử M là một cặp ghép đ ầy đủ tuỳ ý của G , khi đ ó
Suy ra w ( M *) w ( M ). Vậy M * là cặp ghép tối ưu.
23
Graph Matching
Sơ đồ thuật toỏn
Ta sẽ bắt đ ầu từ một phép gán nhãn chấp nhận đư ợc f . Xây dựng đ ồ thị G f . Bắt đ ầu từ một cặp ghép M nào đ ó trong G f ta xây dựng cặp ghép đ ầy đủ trong G f . Nếu tìm đư ợc cặp ghép đ ầy đủ M *, th ì nó chính là cặp ghép tối ưu. Ngược lại, ta sẽ tìm đư ợc cặp ghép cực đại không đ ầy đủ M '. Từ M ' ta sẽ tìm cách sửa phép gán nhãn thành f ' sao cho M ' vẫn là cặp ghép của G f ' và có thể tiếp tục phát triển M ' trong G f '., v.v ...
Qu á trình đư ợc tiếp tục cho đ ến khi thu đư ợc cặp ghép đ ầy đủ trong đ ồ thị cân bằng .
24
Graph Matching
Điều chỉnh nhón
Gi ả sử M là cặp ghép cực đại trong đ ồ thị G f và M chưa là cặp ghép đ ầy đủ của G . Ta cần tìm cách đ iều chỉnh phép gán nhãn f tho ả mãn các yêu cầu đ ặt ra .
Thực hiện tìm kiếm theo chiều rộng từ các đ ỉnh tự do trong X . Gọi S là các đ ỉnh đư ợc thăm trong X , còn T là các đ ỉnh đư ợc thăm trong Y trong qu á trình thực hiện tìm kiếm . Ký hiệu
| S | > | T | (do mỗi đ ỉnh trong T đạt đư ợc từ một đ ỉnh nào đ ó trong S ).
.
25
Graph Matching
Điều chỉnh nhón
Từ tính chất của thuật toán tìm kiếm theo chiều rộng , rõ ràng , không có cạnh nào từ S đ ến T * . Để sửa chữa nhãn , chúng ta sẽ tiến hành giảm đ ồng loạt các nhãn trong S đi cùng một gi á trị nào đ ó , và đ ồng thời sẽ tăng đ ồng loạt nhãn của các đ ỉnh trong T lên . Đ iều đ ó đảm bảo các cạnh từ S sang T ( nghĩa là những cạnh mà một đ ầu mút thuộc S còn một đ ầu mút thuộc T ) không bị loại bỏ khỏi đ ồ thị cân bằng
Các tập S và T trong thực hiện thuật toán . Chỉ vẽ các cạnh trong G f .
S * T *
26
Graph Matching
Điều chỉnh nhón
Khi các nhãn trong S bị giảm , các cạnh trong G từ S sang T * sẽ có kh ả năng gia nhập vào đ ồ thị cân bằng G f . Ta sẽ tăng đ ến khi có thêm ít nhất một cạnh mới gia nhập đ ồ thị cân bằng . Có hai kh ả năng :
Nếu cạnh mới gia nhập đ ồ thị cân bằng giúp ta thăm đư ợc một đ ỉnh không tự do y T * th ì từ nó ta sẽ thăm đư ợc một đ ỉnh đư ợc ghép với nó trong cặp ghép x S * , và cả hai đ ỉnh này đư ợc bổ sung vào S và T tương ứng , và nh ư vậy việc tìm kiếm đư ờng tăng sẽ đư ợc tiếp tục mở rộng .
Nếu cạnh mới gia nhập đ ồ thị cân bằng cho phép thăm đư ợc một đ ỉnh tự do y T * th ì ta tìm đư ợc đư ờng tăng cặp ghép , và kết thúc một pha đ iều chỉnh nhãn .
27
Graph Matching
Điều chỉnh nhón
Ta gọi một pha đ iều chỉnh là tất cả các lần sửa nhãn cần thiết để tăng đư ợc kích thước của cặp ghép M .
Vì sau mỗi pha đ iều chỉnh kích thước của cặp ghép tăng lên 1, nên ta phải thực hiện nhiều nhất n pha đ iều chỉnh .
Trong mỗi pha đ iều chỉnh , do sau mỗi lần sửa nhãn có ít nhất hai đ ỉnh mới đư ợc bổ sung vào danh sách các đ ỉnh đư ợc thăm , nên ta phải thực hiện việc sửa nhãn không qu á n lần . Mặt khác , trong thời gian O ( n 2 ) ta có thể xác đ ịnh đư ợc cạnh nào từ S sang T * là cạnh gia nhập đ ồ thị cân bằng ( bằng việc duyệt hết các cạnh). Từ đ ó suy ra đá nh gi á thời gian tính của thuật toán là O ( n 4 ).
28
Graph Matching
Thuật toỏn
Bước 0: Tìm một phép gán nhãn chấp nhận đư ợc f .
Bước 1: Xây dựng đ ồ thị cân bằng G f .
Bước 2: Tìm cặp ghép cực đại M trong G f .
Bước 3: Nếu M là cặp ghép đ ầy đủ th ì nó là cặp ghép lớn nhất cần tìm . Thuật toán kết thúc .
Bước 4: Gọi S là tập các đ ỉnh tự do trong X . Thực hiện tìm kiếm từ các đ ỉnh trong S . Gọi T là tập các đ ỉnh của Y đư ợc thăm trong qu á trình tìm kiếm . Bổ sung các đ ỉnh trong X đư ợc thăm trong qu á trình tìm kiếm vào S .
Bước 5: Tiến hành đ iều chỉnh nhãn f ta sẽ bổ sung đư ợc các cạnh vào G f cho đ ến khi tìm đư ợc đư ờng tăng , bổ sung các đ ỉnh mới đư ợc thăm vào S và T tương ứng nh ư đã mô tả ở trên . Tăng cặp ghép M và quay lại bước 3.
29
Graph Matching
Tăng hiệu quả
Để có đư ợc thuật toán với đá nh gi á thời gian tính tốt hơn , vấn đề đ ặt ra là làm thế nào có thể tính đư ợc gi á trị tại mỗi lần sửa nhãn của pha đ iều chỉnh một cách nhanh chóng .
Ta xác đ ịnh độ lệch của các cạnh theo công thức
slack ( x , y ) = f ( x ) + f ( y ) – c ( x , y ).
30
Graph Matching
Tăng hiệu quả
Khi đ ó
Rõ ràng việc tính trực tiếp theo công thức đ òi hỏi thời gian O ( n 2 ). Bây giờ , nếu với mỗi đ ỉnh trong T * ta ghi nhận lại cạnh với độ lệch nhỏ nhất
31
Graph Matching
Tăng hiệu quả
Việc tính gi á trị độ lệch slack ( y j ) đ òi hỏi thời gian O ( n 2 ) ở đ ầu pha đ iều chỉnh . Khi tiến hành pha đ iều chỉnh ta có thể sửa lại tất cả các độ lệch trong thời gian O ( n ) do chúng bị thay đ ổi cùng một gi á trị (do nhãn của các đ ỉnh trong S giảm đ ồng loạt đi cùng một gi á trị ). Khi một đ ỉnh x đư ợc chuyển từ S * sang S ta cần tính lại các độ lệch của các đ ỉnh trong T * , việc đ ó đ òi hỏi thời gian O ( n ). Tuy nhiên sự kiện một đ ỉnh đư ợc chuyển từ S * sang S chỉ xảy ra nhiều nhất n lần .
Nh ư vậy , mỗi pha đ iều chỉnh có thể cài đ ặt với thời gian O ( n 2 ). Do có không qu á n pha đ iều chỉnh trong thuật toán , nên cách cài đ ặt này cho ta thuật toán với thời gian tính O ( n 3 ).
32
Graph Matching
Vớ dụ
Xột bài toỏn với ma trận hiệu quả
33
Graph Matching
Vớ dụ
Bắt đầu từ phộp gỏn nhón
Đồ thị cõn bằng G f
Cặp ghép cực đại tìm đư ợc
M = {( x 1 , y 2 ), ( x 2 , y 1 ), ( x 4 , y 4 ) }.
Tìm kiếm theo chiều rộng bắt đ ầu từ đ ỉnh tự do x 3 ta có
S = { x 2 , x 3 }, T = { y 1 }
34
Graph Matching
Vớ dụ
Tính
= min { f ( x )+ f ( y )- w ( x,y ): x { x 2 , x 3 }, y { y 2 , y 3 , y 4 } } = 1.
Tiến hành sửa nhãn , ta đi đ ến phép gán nhãn mới
35
Graph Matching
Vớ dụ
Theo đư ờng tăng cặp ghép
x 3 , y 3 , x 4 , y 4
ta tăng cặp ghép M thành cặp ghép đ ầy đủ
M ={( x 1 , y 2 ), ( x 3 , y 1 ), ( x 2 , y 3 ), ( x 4 , y 4 )},
đ ồng thời là cặp ghép tối ưu với trọng lượng
w ( M ) = 4 + 2 + 5 + 2 = 13.
36
Graph Matching
Cài đặt trờn Pascal
const maxn = 170;
type data1=array [1..maxn,1..maxn] of integer;
data2=array [1..2* maxn ] of integer;
data3=array [1..2* maxn ] of longint ;
var c: data1;
px , py , q, queue: data2;
a, b, f: data3;
n, n2, k, u, z: integer;
37
Graph Matching
Khởi tạo
procedure init;
var i, j: integer;
begin
n2:= n+n ; fillchar(f,sizeof(f),0);
for i:=1 to n do
for j:=1 to n do
if f[i ]< c(i,j ) then f[i ]:= c(i,j );
k:=0;
fillchar(px,sizeof(px),0); fillchar(py,sizeof(py),0);
for i:=1 to n do
for j:=1 to n do
if ( py[j ]=0) and ( f[i]+f[j+n ]= c(i,j )) then
begin
px[i ]:=j; py[j ]:=i; inc(k );
break;
end;
end;
38
Graph Matching
function FoundIncPath : boolean ;
var dq , cq , v, w: integer;
begin
fillchar(q,sizeof(q),0);
dq :=1; cq :=1; queue[dq ]:=u; q[u ]:=u;
while dq <= cq do
begin
v:= queue[dq ]; inc(dq );
if v<=n then
begin
for w:=n+1 to n2 do
if ( f[v]+f[w ]= c(v,w-n )) and ( q[w ]=0) then
begin inc(cq ); queue[cq ]:=w; q[w ]:=v; end;
end else
if ( py[v-n ]=0) then begin FoundIncPath := true;z := v;exit ; end
else begin w:= py[v-n ]; inc(cq ); queue[cq ]:=w; q[w ]:=v; end;
end;
FoundIncPath :=false;
end;
Tỡm đường tăng
39
Graph Matching
Tỡm đỉnh tự do
function FreeNodeFound : boolean ;
var i:integer ;
begin
for i:=1 to n do
if px[i ]=0 then
begin
u:=i;
FreeNodeFound :=true;
exit;
end;
FreeNodeFound :=false;
end;
40
Graph Matching
Tăng cặp ghộp và Sửa nhón
procedure Tangcapghep ;
var i, j: integer;
ok: boolean ;
begin
j:=z; ok:=true;
while ju do
begin
i:= q[j ];
if ok then
begin
px[i ]:= j-n ;
py[j-n ]:=i;
end;
j:=i;
ok:= not ok;
end;
inc(k );
end;
procedure Suanhan ;
var i, j: integer;
d: longint ;
begin
d:= maxlongint ;
for i:=1 to n do
if q[i ]>0 then
for j:=n+1 to n2 do
if q[j ]=0 then
if d> longint(f[i]+f[j]-c(i,j-n )) then
d:= longint(f[i]+f[j]-c(i,j-n ));
for i:=1 to n do
if q[i ]>0 then dec(f[i],d );
for j:=n+1 to n2 do
if q[j ]>0 then inc(f[j],d );
end;
41
Graph Matching
Main Procedure
procedure Solve;
begin
init;
while FreeNodeFound do
begin
while not FoundIncPath do suanhan ;
Tangcapghep ;
end;
end;
42
Graph Matching
43
Graph Matching
File đính kèm:
bai_giang_toan_roi_rac_phan_2_ly_thuyet_do_thi_bai_toan_ghep.ppt

