1. Trang chủ
  2. » Vật lí lớp 11

Thuật toán trên đồ thị

7 5 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 819,23 KB

Nội dung

[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ắ ấ

Ngày đăng: 09/03/2021, 05:09

w