Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (66.39 KB, 9 trang )
Một số ứng dụng của bài toán luồng cực đại
Lê Thanh Hà
Ta xét bài toán sau:
- Có m chàng trai, mỗi chàng biết những cô gái mà anh ta vừa ý trong n cô gái trong làng,
liệu có thể xếp cặp cho cả m chàng trai đó không.
- Có m thợ, mỗi thợ có khả năng làm được một số công việc nào đó. Và bạn hãy xắp xếp
việc làm cho m thợ sao cho mội thợ chỉ làm một việc và mỗi việc chỉ do một người thợ
đảm nhiệm.
Để giải quyết hai bài toán trên ta xây dựng đồ thị với các đỉnh biểu thị cho các chàng trai
Ti(hay người thợ) và các cô gái (hay công việc) còn các cạnh biểu thị sự vừa ý của các
chàng trai đối với các cô gái Gi (hay khả năng của các người thợ đối với các công việc).
Khi đó đồ thị mà ta nhận được là đồ thị hai phía.
Giả sử ta đã thu được đồ thị sau:
Ta gán cho trọng số của mỗi cạnh là 1. Và tìm luồng cực đại từ S sang T. Nhưng nếu áp
dụng thuật toán lát cắt hẹp nhất để tìm luồng cực đại trong một đồ thị tương đối đơn giản
này thì quả thật là "đem dao mổ trâu để giết ruồi". Bạn hãy đọc kĩ đoạn chương trình sau,
thuật toán đã cắt lược đi rất nhiều bước của thuật toán tìm luồn cực đại để giải bài toán
trên. Trong đó hoàn toàn không còn các đỉnh S và T nữa và thời gian của thuật toán này so
với thuật toán tìm luồng chuật thì thật tuyệt vời. Và thực tế nó đã hoàn toàn chuyển sang
dạng thuật toán tìm cặp ghép cực đại trong đồ thị hai phía.
uses crt;
const fi = 'input.txt';
fo = 'output.txt';
var m:array[1..200,1..200] of byte;
a,b,c,dt:array[1..200] of byte;
s:string;
n:byte;
f:text;
time:longint;
tich:longint absolute 0:$46c;
procedure input;