[r]
(1)M t s ng d ng c a toán lu ng c cộ ố ứ ụ ủ ồ ự
đ iạ Ta xét toán sau:
- Có m chàng trai, m i chàng bi t nh ng cô gái mà v a ý 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 làm đợ ỗ ợ ả ược m t s cơng vi c Và b n x pộ ố ệ ắ
x p vi c làm cho m th cho m i th ch làm m t vi c m i vi c ch m tế ệ ợ ộ ợ ỉ ộ ệ ỗ ệ ỉ ộ
người th đ m nhi m.ợ ả ệ
Đ gi i quy t hai toán ta xây d ng đ th v i đ nh bi u th cho chàngể ả ế ự ị ỉ ể ị
trai Ti(hay người th ) gái (hay cơng vi c) cịn c nh bi u th s v a ý c aợ ệ ể ị ự ủ
các chàng trai đ i v i cô gái Gi (hay kh c a ngố ả ủ ười th đ i v i côngợ ố
vi c) Khi đ th mà ta nh n đệ ị ậ ược đ th hai phía ị
Gi s ta thu đả ược đ th sau:ồ ị
Ta gán cho tr ng s c a m i c nh 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 m t đ th tụ ậ ắ ẹ ấ ể ự ộ ị ương đ iố
đ n gi n qu th t "đem dao m trâu đ gi t ru i" B n đ c kĩ đo nơ ả ả ậ ổ ể ế ọ
chương trình sau, thu t toán c t lậ ắ ược r t nhi u bấ ề ướ ủc c a thu t tốn tìm lu n c cậ ự
đ i đ gi i toán Trong hồn tồn khơng cịn đ nh S T n a th iạ ể ả ỉ ữ
gian c a thu t toán so v i thu t tốn tìm lu ng chu t th t t v i Và th c tủ ậ ậ ậ ậ ệ ự ế
nó hồn tồn chuy n sang d ng thu t tốn tìm c p ghép c c đ i đ th haiể ậ ặ ự ị
phía uses crt;
(2)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;
var i,j:byte; begin assign(f,fi); reset(f); readln(f,n);
fillchar(m,sizeof(m),0); while not eof(f) begin
(3)procedure tim; label done; var i,j,k:byte; begin
fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0); for i:=1 to n
if a[i]=0 then begin
s:=chr(i);
fillchar(c,sizeof(c),0); repeat
k:=ord(s[length(s)]); delete(s,length(s),1); for j:=1 to n
if (c[j]=0) and (m[k,j]=1) then begin
c[j]:=1; dt[j]:=k;
if b[j]>0 then s:=s+chr(b[j]) else begin
(4)b[j]:=dt[j]; k:=a[dt[j]]; a[dt[j]]:=j; j:=k; until j=0; goto done; end; end; until s=''; done: end;
writeln(tich-time); assign(f,fo); rewrite(f); k:=0;
for i:=1 to n if a[i]<>0 then inc(k); writeln(f,k);
for i:=1 to n if a[i]<>0 then writeln(f,i,' ',a[i]); close(f);
end;
(5)time:=tich; tim; end
Tuy nhiên tốn s th c s khó h n n u nh m i chàng trai s có m t m c đ tìnhẽ ự ự ế ỗ ẽ ộ ứ ộ
c m đ i v i m i cô gái hay m i ngu i th s có m t xu t đ i v iả ố ỗ ỗ ợ ẽ ộ ấ ỗ
m i công vi c Và công vi c c a ta ph i làm ghép c p cho chàng trai v i côỗ ệ ệ ủ ả ặ
gái người th v i m i công vi c đ không nh ng tho mãn u ki n nh cũ màợ ỗ ệ ể ữ ả ề ệ
t ng s m c đ tình c m hay xu t ph i l n nh t Đ gi i quy t v n đ taổ ố ứ ộ ả ấ ả ấ ể ả ế ấ ề
ti p t c c i ti n thu t toán trên: Trế ụ ả ế ậ ước tiên ta xây d ng m t đ th hai phía m i v iự ộ ị ớ
các đ nh v n nh cũ Ta l n lỉ ẫ ầ ượt thêm vào đ th t ng c nh c a đ th cũ theo th tồ ị ủ ị ứ ự
t cao xu ng th p c a giá tr tr ng s Sau m i l n thêm, ta l i tìm m t c p ghép c cừ ố ấ ủ ị ọ ố ỗ ầ ộ ặ ự
đ i đ th cho t i tìm đạ ị ược giá tr c c đ i b ng m d ng B n thamị ự ằ
kh o chả ương trình sau: uses crt;
const fi = 'input.txt'; fo = 'output.txt';
var m,dx:array[1 150,1 150] of byte; a,b,c,dtr:array[1 150] of byte;
n:byte; dem:word; f:text;
time:longint absolute 0:$46c; tich:longint;
(6)If ktr(front,top,v) then
Begin So_pts:=so_pts+1;P[so_pts]:=v End End;
If j
If ktr(front,top,v) then
Begin So_pts:=so_pts+1; P[so_pts]:=v; End End;
If I
If ktr(front,top,v) then
Begin So_pts:=so_pts+1;P[so_pts]:=v;End End;
End;
PROCEDURE Sxep(Var P:node1;so_pts:tp); Var Tg :vec; T,i,j,min :tp; B :array[1 4] of byte; Begin For i:=1 to so_pts B[i]:=count(p[i]); For i:=1 to so_pts-1
Begin Min:=i;
For j:=i+1 to so_pts If b[j] If min>i then
Begin T:=b[i]; B[i]:=b[min];B[min]:=t; Tg:=p[i];P[i]:=p[min];P[min]:=tg; End End
End;
PROCEDURE Push(var top:pointer;p:node1;child:longint;so_pts:tp); Var i:tp;v:pointer;
Begin For i:=so_pts downto Begin New(v); V^.infor.ma:=p[i]; V^.infor.father:=child; Id:=id+1; V^.infor.child:=id; V^.next:=top; Top:=v;End End; PROCEDURE In_Kq;
Var p :pointer;i,buoc :longint; Begin Buoc:=0;
P:=front;I:=1; assign(ff,fo); rewrite(ff); if not found then begin write(ff,0); close(ff); exit; end; P:=p^.next; While P<>nil
(7)Begin
I:=p^.infor.child; Buoc:=buoc+1; Writeln(ff,buoc);In_vec(P^.infor.ma); End; P:=p^.next
End; close(ff); End; Begin Clrscr;Init;
While (top<>nil) and not(Found) Begin Pop(Top,U); Ađ(u,Rear,Front); If dung(u.ma,dich) then found:=true Else Begin Vi_tri(U.ma,i,j); So_pts:=0; Ptu_ke(p,u.ma,i,j,so_pts);
sxep(p,so_pts);Push(top,p,u.child,so_pts) End End;
In_kq; End
Bài t p:ậ Cho m t ma tr n nh phân (các s hay 1) kích thộ ậ ị ố ước 500 x 500 Hai ô g i k n u chúng ch a s chung c nh Hai ô g i đọ ề ế ứ ố ọ ược đ n n u chúng có th đế ế ể ược đ n qua m t s bế ộ ố ước d ch chuy n qua ôị ể
k nhau, s bề ố ước d ch chuy n đ dài c a đị ể ộ ủ ường tìm đường ng n nh t tắ ấ