Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 26

Cc thut ton tm kim trn th v mt s bi tp ng dng

A. M U
I. L do chn ti
T hc tp, nghin cu l mt nhim v quan trng ca mi gio vin nng
cao trnh chuyn mn, c bit t hc, t nghin cu c vai tr quan trng trong
vn bi dng hc sinh gii.
V vy, trong nm hc ny ti nghin cu chuyn : Cc thut ton tm
kim trn th v mt s bi tp ng dng.
II. Mc tiu nghin cu ca ti
Tm hiu t tng, thut ton tm kim trn th: DFS BFS.
Mt s bi tp ng dng:
+ bi
+ tng thut ton
+ Chng trnh
+ Xy dng b test
III. Phng php nghin cu
- Nghin cu c s l thuyt
- Thu thp thng tin, ti liu
- Tm hiu mt s bi ton ng dng
IV. Gii hn, phm vi nghin cu ca ti
Chuyn bi dng hc sinh gii, c mt s bi kh ch p dng cho i
tng hc sinh chn i tuyn v bi dng quc gia.

1
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

B. NI DUNG
I. C s l thuyt
1. Thut ton tm kim theo chiu su
T tng chnh ca thut ton l: Gi s chng ta ang xt trn th G(V,E).
T mt nh u thuc V hin thi no ta s thm ti nh k v ca u v qu trnh
c lp li i vi nh v. bc tng qut, gi s hin ti ang xt nh u 0, chng
ta s c hai kh nng s xy ra:
+ Nu nh tn ti mt nh v 0 k vi u m cha c thm th nh v 0 s tr
thnh nh thm v qu trnh tm kim li bt u t nh v0 .
+ Ngc li, nu mi nh k vi u0 u thm th ta s quay tr li nh m
trc ta n nh u0 tip tc qu trnh tm kim.
Nh vy, trong qu trnh thm nh bng thut ton tm kim theo chiu su,
nh c thm cng mun cng sm c duyt xong (C ch Last In First Out Vo sau ra trc). Do , ta c th t chc qu trnh ny bng mt th tc quy
nh sau:
Procedure DFS(u);
Begin
Visit(u);
Daxet[u]:=True;
For v thuc K(u) do
if not Daxet[v] then DFS(v);
End;
V th tc duyt h thng ton b nh ca th s l:
Procedure Find;
Begin
Fillchar(Daxet,SizeOf(Daxet),False);
For u thuc V do
if not Daxet[u] then DFS(u);
End;
D nhn thy rng, mi ln gi DFS(u) th ton b cc nh cng thnh phn lin
thng vi u s c ving thm. Th tc Visit(u) l thao tc trn nh u trong tng bi
ton t ra c th.

2
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

2. Thut ton tm kim theo chiu rng


Thut ton ny thc ra l s ci bin v th t duyt nh trn th ca tm
kim theo chiu su bng cch thay v dng mt STACK th ta li dng mt hng i
QUEUE kt np nh c thm. Nh vy, nh c thm cng sm s cng sm
tr thnh duyt xong (c ch First In First Out - Vo trc ra trc). Th tc c
m t di y:
Procedure BFS(u);
Begin
Queue:=Empty
Kt np u vo Queue;
Daxet[u]:=True;
While Queue<>Empty do
Begin
Ly v t Queue;
Visit(v);
For w thuc K(v) do
If not Daxet[w] then
Begin
Kt np w vo Queue;
Daxet[w]:=True;
End;
End;
End;
Ta c th tc tm kim theo chiu rng l:
Procedure Find;
Begin
Fillchar(Daxet,SizeOf(Daxet),False);
For u thuc V do
If not Daxet[u] then BFS(u);
End;
Tng t nh thut ton tm kim theo chiu su, thut ton ny mi ln gi
th tc BFS(u) th mi nh cng thnh phn lin thng vi u s c thm. Th tc
Visit(u) nh ni trn.
T hai thut ton trn, rt nhiu bi ton c bn trn th c gii quyt rt d
dng.
* Bi ton tm thnh phn lin thng ca th
3
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

Cho mt th G =(V,E). Hy cho bit s thnh phn lin thng ca th v


mi thnh phn lin thng gm nhng nh no.
Nh ta bit, cc th tc DFS(u) v BFS(u) cho php ving thm tt c cc
nh c cng thnh phn lin thng vi u nn s thnh phn lin thng ca th
chnh l s ln gi th tc trn. Ta s dng thm bin m Connect m s thnh
phn lin thng.
V vng lp chnh trong cc th tc tm kim theo chiu su hay chiu rng ch
cn sa li nh sau:
Procedure Find;
Begin
Fillchar(Daxet,SizeOf(Daxet),False);
Connect:=0;
For u thuc V do
If not Daxet[u] then
Begin
Inc(Connect); DFS(u); (* BFS(u) *)
End;
End;
Th tc Visit(u) s lm cng vic nh s thnh phn lin thng ca nh u:
LienThong[u]:= Connect;
* Bi ton tm ng i gia hai nh ca th
Cho th G =(V,E). Vi hai nh s v t l hai nh no ca th. Hy tm
ng i t s n t.
Do th tc DFS(s) v BFS(s) s thm ln lt cc nh lin thng vi u nn sau
khi thc hin xong th tc th c hai kh nng:
+ Nu Daxet[t] =True th c ngha: tn ti mt ng i t nh s ti nh t.
+ Ngc li, th khng c ng i ni gia s v t
Vn cn li ca bi ton l: Nu tn ti ng i ni nh s v nh t th
lm cch no vit c hnh trnh (gm th t cc nh) t s n t.
Dng mt mng Truoc vi: Truoc[v] l nh trc ca v trong ng i. Khi ,
cu lnh If trong th tc DFS(u) c sa li nh sau:
if not Daxet[v] then
Begin
DFS(v);
Truoc[v]:= u;
End;
4
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

Cn vi th tc BFS ta cng sa li trong lnh If nh sau:


If not Daxet[w] then
Begin
Kt np w vo Queue;
Daxet[w]:= True;
Truoc[w]:= v;
End;
Vic vit ng i ln mn hnh (hoc ra file) c th c 3 cch:
- Vit trc tip da trn mng Truoc: Hin nhin ng i hin th s ngc t
nh t tr v s nh sau:
p1:=Truoc[t] p2:=Truoc[p1] .... s
- Dng thm mt mng ph P: cch ny dng o ng i t mng Truoc
c ng i thun t nh s n nh t.
- Cch th 3: l dng chng trnh quy vit ng i.
Procedure Print_Way(i:Byte);
If i<>s then
Begin
Print_Way(Truoc[i]);
Write('->', i);
End;
Li gi th tc quy nh sau:
Write(s);
Print_Way(s);
Cc bn c th tu chn cch m mnh thch nhng thit ngh cha phi l
vn quan trng nht. Nu tinh da vo th t thm nh ca thut ton tm kim
theo chiu rng BFS ta s c mt nhn xt rt quan trng, l:
Nu c ng i t s n t, th ng i tm c do thut ton tm kim theo
chiu rng cho chng ta mt hnh trnh cc tiu v s cnh.
Nhn xt quan trng trn l c s cho cc thut ton tm kim li gii ti u da
trn l thuyt th. Thc ra, n l trng hp ring ca mt bi ton ln trong th
- Bi ton tm ng i ngn nht.
Trn y l nhng thut ton tm kim c bn nhng rt quan trng trn th.
Nhng thut ton ny s l nn mng quan trng c th xy dng v thit k
nhng thut gii khc trong l thuyt th.
5
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

II. Bi tp ng dng
1. Bi c ngon nht VBGRASS
Bessie d nh c ngy s nhai c xun v ngm nhn cnh xun trn cnh ng
ca nng dn John, cnh ng ny c chia thnh cc vung nh vi R (1 <= R
<= 100) hng v C (1 <= C <= 100) ct. Bessie c g c th m c s khm c
trn cnh ng.
Mi khm c trn bn c nh du bng mt k t # hoc l 2 k t #
nm k nhau (trn ng cho th khng phi). Cho bn ca cnh ng, hy ni
cho Bessie bit c bao nhiu khm c trn cnh ng.
V d nh cnh ng di dy vi R=5 v C=6:
.#....
..#...
..#..#
...##.
.#....
Cnh ng ny c 5 khm c: Mt khm hng u tin, mt khm to bi
hng th 2 v th 3 ct th 2, mt khm l 1 k t nm ring r hng 3, mt
khm to bi ct th 4 v th 5 hng 4, v mt khm cui cng hng 5.
D liu
Dng 1: 2 s nguyn cch nhau bi du cch: R v C
Dng 2..R+1: Dng i+1 m t hng i ca cnh ng vi C k t, cc k t l
# hoc . .
Kt qu
Dng 1: Mt s nguyn cho bit s lng khm c trn cnh ng.
V d:
VBGRASS.INP

VBGRASS.OU
T

56
.#....
..#...
..#..#
...##.
.#....

6
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

tng: S lng cc khm c c th xem l s vng lin thng trn th. Trong
, khi a[i,j] l c v 4 nh ln cn ca n, nu cng l c th tn ti ng i t
a[i,j] n nh .
Uses math;
Const
fi
fo

='VBGRASS.INP';
='VBGRASS.OUT';

MAXN

= 200;

Var
f : array [0..MAXN+1,0..MAXN+1] of boolean;
m,n
: longint;
Res
: longint;
Procedure Init();
begin
Fillchar(f,sizeof(f),false);
Res := 0;
end;
Procedure ReadData();
var i,j : longint;
c
: char;
begin
Readln(m,n);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(c);
f[i,j] := c = '#';
end;
readln;
end;
end;

BEGIN
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
Init();
ReadData();
Solve();
Writeln(Res);
7

Duyn

Procedure Dfs(x,y: longint);


const
tx
: array [1..4] of longint = (1,-1,0,0);
ty
: array [1..4] of longint = (0,0,1,-1);
var
i,u,v: longint;
begin
f[x,y]:=false;
for i:=1 to 4 do
begin
u:=tx[i] + x;
v:=ty[i] + y;
if f[u,v] then
dfs(u,v);
end;
end;
Procedure Solve();
var i,j : longint;
begin
for i:=1 to m do
for j:=1 to n do
if f[i,j] then
begin
dfs(i,j);
inc(Res);
end;
end;

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


close(input); close(output);
END.

8
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

2. Gm c
Bessie rt yu bi c ca mnh v thch th chy v chung b vo gi vt sa
bui ti. Bessie chia ng c ca mnh l 1 vng hnh ch nht thnh cc vung
nh vi R (1 <= R <= 100) hng v C (1 <= C <= 100) ct, ng thi nh du ch
no l c v ch no l . Bessie ng v tr R_b,C_b v mun n c theo cch ca
mnh, tng vung mt v tr v chung 1,1 ; bn cnh ng i ny phi l
ngn nht.
Bessie c th i t 1 vung sang 4 vung khc k cnh.
Di y l mt bn v d [vi ('*'), c ('.'), chung b ('B'), v Bessie ('C')
hng 5, ct 6] v mt bn cho bit hnh trnh ti u ca Bessie, ng i c
dnh du bng ch m.
Bn
ng i ti u
1 2 3 4 5 6 <-ct
1 2 3 4 5 6 <-ct
1B...*.
1Bmmm*.
2..*...
2..*mmm
3.**.*.
3.**.*m
4..***.
4..***m
5*..*.C
5*..*.m
Bessie n c 9 c.
Cho bn , hy tnh xem c bao nhiu c m Bessie s n c trn con
ng ngn nht tr v chung (tt nhin trong chung khng c c u nn ng c
tnh nh)
D liu
Dng 1: 2 s nguyn cch nhau bi du cch: R v C
Dng 2..R+1: Dng i+1 m t dng i vi C k t (v khng c du cch) nh
ni trn.
Kt qu
Dng 1: Mt s nguyn l s c m Bessie n c trn hnh trnh ngn nht
tr v chung.

9
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

V d
VMUNCH.INP

VMUNCH.OUT

56
9
B...*.
..*...
.**.*.
..***.
*..*.C
tng : Bfs bt u t nh B, vi bng f[i,j] l di ng i ngn nht t nh
(i,j) n nh B, kt qu l f[cx,cy];
Const
fi
fo
MAXN
tx
ty

='VMUNCH.inp';
='VMUNCH.out ';
=1500;
: array [1..4] of longint = (1,0,-1,0);
: array [1..4] of longint = (0,1,0,-1);

Type
pos=record
x,y : longint;
end;
Var
a : array [0..MAXN,0..MAXN] of boolean;
d : array [1..MAXN,1..MAXN] of longint;
q : array [1..MAXN*MAXN] of pos;
r,c,cx,cy
: longint;
Procedure nhap;
var i,j
: longint;
t
: char;
begin
assign(input,fi);reset(input);
fillchar(a,sizeof(a),false);
readln(r,c);
for i:=1 to r do
begin

Procedure xuat;
begin
assign(output,fo);rewrite(output);
10

Duyn

Procedure xuly;
var bot,top,x,y,i : longint;
u
: pos;
begin
bot:=1;top:=1;
repeat
u:=q[top];inc(top);
a[u.x,u.y]:=false;
for i:=1 to 4 do
begin
x:=u.x+tx[i];y:=u.y+ty[i];
if a[x,y] then
begin
a[x,y]:=false;
inc(bot);
q[bot].x:=x;
q[bot].y:=y;
d[x,y]:=d[u.x,u.y]+1;
end;
end;
until top>bot;
end;

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


for j:=1 to c do
begin
read(t);a[i,j]:=t='.';
d[i,j]:=1;
if t='B' then
begin
q[1].x:=i;
q[1].y:=j;
end;
if t='C' then
begin
a[i,j]:=true;
cx:=i;
cy:=j;
end;
end;
readln;
end;
close(input);
end;

writeln(d[cx,cy]-1);
close(output);
end;
BEGIN
NHAP;
XULY;
XUAT;
END.

3. Mch in
Mch in l mt bng gm cc nt nm trn cc nt ca mt li hnh ch nht v
cc on dy dn noi cc nt k nhau (theo chiu ng hoc ngang). Mch c gi
l lin thng nu hai nt bt k c ni vi nhau bi dy cc on dy dn. Cho mt
mch in trong c mt s on dy dn ni mt lot cc cp nt k nhau. Cn
tm cch b sung cc on dy n m bo mch in thu c l lin thng v vi
chi ph nh nht. Bit rng: chi ph ca on dy ni theo chiu ng l 1, cn theo
chiu ngang l 2.

Hnh 1

Hnh 2

11
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

D liu: Vo t file vn bn CIRCUIT.INP:


Dng u tin cha hai s nguyn N v M. N (1N100 l s dng v M
(1M100) l s ct ca li. Mi nt trn ca li c xc nh bi hai to :
Nt gc tri trn c to (1,1), nt gc phi di c to (N,M)
Mi mt trong s N dng tip theo cha M snguyn. S nguyn tn dng i v
ct j ca dng ny m t on dy ni gia cp ni (i,j) v (i+1,j) cng nh gia
cp nt (i,j) v (i,j+1) theo qui tc sau:
0 c ngha l khng c on dy ni gia (i,j) v (i+1,j) cng nh gia cp nt
(i,j) v (i,j+1)
1 c ngha l c on dy ni gia cp nt (i,j) v (i+1,j);
2 c ngha l c on dy ni gia cp nt (i,j) v (i,j+1);
3 c ngha l c cp nt (i,j) v (i+1,j) v (i,j) v (i,j+1) u c ni vi nhau
Kt qu: ghi ra file vn bn CIRCUIT.OUT:
Dng u tin cha hai s nguyn K v V, trong K l s on ni cn b sung
trong cch b sung vi chi ph nh nht tm c cn V l chi ph tng ng.
Mi mt trong s K dng tip theo cha ba s nguyn i,j v d, trong (i,j) l to
ca nt cn d ch nhn mt trong hai gi tr 1 v 2. d=1 cho bit phi ni nt
(i,j) vi (i+1,j) v d=2 cho bit phi ni nt (i,j) vi (i,j+1)
V d: Xem minh ho trong hnh 1 v 2
CIRCUIT.INP
CIRCUIT.OUT
45
56
21121
111
03010
321
30031
331
02020
332
251
tng: Ti mi nt (i,j) ta xt 4 nt xung quanh ca n: Q1(i,j-1), Q2(i+1,j),
Q3(i,j+1), Q4(i-1,j).
Q4 (i-1,j)
Q1 (i,j-1)

Q3 (i,j+1)

.(i,j)
Q2 (i+1,j)

12
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

- Nu cc nt ny k vi n v cha c thm th thm nt v tip tc duyt


nt . Sau khi xt ht 4 nt xung quanh ca nt (i,j), nu nt no vn cha c
thm th ta np n vo 1 mng u tin chiu dc (Q2, Q4) np vo pha u mng
ly ra trc, chiu ngang (Q1, Q3) np vo pha cui mng ly ra sau. Lu : Khi
lu cc nt ny vo mng th phi nh du phn bit nt no l nt Q1, Q2, Q3,
Q4. Chng hn: nt Q1, Q4 khi lu vo mng th vn gi nguyn ta , nt Q2 th
ta i cng thm N, nt Q3 ta j cng thm M.
VEnd
HEnd
Q2 Q4
....
....
Q3
Q1
- Ly phn t trong mng ra, u tin ly ht cc phn t pha u mng, sau
mi ly ht cc phn t pha cui mng. Mi ln ly 1 phn t (1 nt):
+ nh du thm
+ lu ch s ca nt :
Nu nt Q2 th lu ta x-1,y, chi ph 1.
Nu nt Q4 th lu ta x, y, chi ph 1
Nu nt Q3 th lu ta x, y-1, chi ph 2
Nu nt Q1 th lu ta x, y, chi ph 2
+ duyt nt .
- Qu trnh lp li cho n khi ly ht cc phn t trong mng.
Chng trnh:
Program Circuit;
Const
MaxN=101;
Visited=16;
fin: string = 'CIRCUIT.INP';
fou: string = 'CIRCUIT.OUT';
Type
Node = Record
x, y: Byte
End;
Table = Record
HEnd,VEnd:Word;
T:Array[1..MaxN*MaxN] of Node
End;
Var
N,M,MN: Word;
G: Array[0..MaxN,0..MaxN] Of Byte;
Disp: Table;
Cost, OC: Word;
OList: Array[1..MaxN*MaxN] of Record
13
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


x,y,c: Byte
End;
Procedure ReadIn;
Var
InFile: Text;
x,y,z: Byte;
Begin
Assign(InFile, fin); Reset(InFile);
ReadLn(InFile, N,M);
For x:=1 To N Do
Begin
For y:=1 To M Do
Begin
Read(InFile, z);
G[x,y]:=z;
End;
ReadLn(InFile);
End;
Close(InFile);
For x:=0 To N+1 Do
Begin
G[x,0]:=Visited;
G[x,M+1]:=Visited;
End;
For y:=0 To M+1 Do
Begin
G[0,y]:=Visited;
G[N+1,y]:=Visited;
End;
End;
Procedure WriteOut;
Var i:Integer;
OutF:Text;
Begin
Assign(OutF, fou); Rewrite(OutF);
WriteLn(OutF, OC,' ',Cost);
For i:=1 To OC Do
WriteLn(OutF, OList[i].x,' ',OList[i].y,' ',OList[i].c);
Close(OutF);
End;
Function NotEmptyVert:Boolean;
Begin
NotEmptyVert:=Disp.VEnd>0
14
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


End;
Function NotEmptyHoriz:Boolean;
Begin
NotEmptyHoriz:=Disp.HEnd<=MN
End;
Procedure TakeVert(Var P:Node);
Begin
P:=Disp.T[Disp.VEnd];
Dec(Disp.VEnd);
End;
Procedure TakeHoriz(Var P:Node);
Begin
P:=Disp.T[Disp.HEnd];
Inc(Disp.HEnd);
End;
Procedure PutVert(Const P:Node);
Begin
Inc(Disp.VEnd);
Disp.T[Disp.VEnd]:=P;
End;
Procedure PutHoriz(Const P:Node);
Begin
Dec(Disp.HEnd);
Disp.T[Disp.HEnd]:=P;
End;
Procedure DFS(P:Node);
Var
Q1,Q2,Q3,Q4: Node;
Begin{DFS}
G[P.x,P.y]:=G[P.x,P.y]+Visited;
Q1.x:=P.x; Q1.y:=P.y-1;
If (G[Q1.x,Q1.y]<Visited) And (G[Q1.x,Q1.y]>1) Then
DFS(Q1);
Q2.x:=P.x+1; Q2.y:=P.y;
If (G[Q2.x,Q2.y]<Visited) And Odd(G[P.x,P.y]-Visited) Then
DFS(Q2);
Q3.x:=P.x; Q3.y:=P.y+1;
If (G[Q3.x,Q3.y]<Visited) And (G[P.x,P.y]-Visited>1) Then
DFS(Q3);
Q4.x:=P.x-1; Q4.y:=P.y;
If (G[Q4.x,Q4.y]<Visited) And Odd(G[Q4.x,Q4.y]) Then
15
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


DFS(Q4);
If G[Q1.x,Q1.y]<Visited Then
PutHoriz(Q1);
If G[Q2.x,Q2.y]<Visited Then
Begin
Q2.x:=Q2.x+N;
PutVert(Q2);
End;
If G[Q3.x,Q3.y]<Visited Then
Begin
Q3.y:=Q3.y+M;
PutHoriz(Q3);
End;
If G[Q4.x,Q4.y]<Visited Then
PutVert(Q4);
End;
Procedure PutOut(P:Node; c:Byte);
Begin
Inc(Cost,c);
Inc(OC);
OList[OC].x:=P.x; OList[OC].y:=P.y; OList[OC].c:=c;
End;
Procedure Compute;
Var
P,Q:Node;
Begin
MN:=M*N;
Disp.VEnd:=0; Disp.HEnd:=MN+1;
Cost:=0; OC:=0;
P.x:=1; P.y:=1;
DFS(P);
While True Do
Begin
If NotEmptyVert Then
Begin
TakeVert(P);
If P.x>N Then
Begin
P.x:=P.x-N;
Q.x:=P.x-1;
End Else
Q.x:=P.x;
If G[P.x,P.y]>=Visited Then Continue;
Q.y:=P.y;
PutOut(Q,1);
16
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


DFS(P);
End
Else
If NotEmptyHoriz Then
Begin
TakeHoriz(P);
If P.y>M Then
Begin
P.y:=P.y-M;
Q.y:=P.y-1;
End
Else
Q.y:=P.y;
If G[P.x,P.y]>=Visited Then Continue;
Q.x:=P.x;
PutOut(Q,2);
DFS(P);
End
Else
Break;
End{while};
End;
Begin {MainProgram}
ReadIn;
Compute;
WriteOut;
End.

4. i v
Trong ngy hi th thao vn ho ti sn vn ng trung tm thnh ph s c mt
trn u bng ca i CHAMPION gp i ngi sao thnh ph v mt bui biu
din ca dn nhc ni ting OLIMPIAD. V vo xem s c pht cho tng c nhn
ca cc tp th c nhiu thnh tch trong phong tro th thao vn ho, mi tp th
c pht mt loi v, trn v c ghi tn c th phc v cho vic gi gn an ninh
trt t.
Tp th sinh vin ca mt trng gm N ngi nhn v xem bng , nhng tt
c li mun i xem ca nhc. Rt may l Ban t chc cho php tp th i v theo hnh
thc sau: nhng ngi c v phi tham gia mt s cng vic chun b, mi cng vic
cn ng M ngi thc hin. Sau khi hon thnh cng vic, ai c v xem bng
c i thnh v xem ca nhc v ngc li, ai c v xem ca nhc c i thnh v
vo xem bng . Trng on sinh vin quyt nh t chc cho cc bn i lao ng
17
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

v i v. Sau khi cc bn v li t chc nhm khc i i. Mt ngi c th tham


gia i v nhiu ln nu cn, nhng khng c i i v h ngi khc.
Yu cu: Hy xc nh ti thiu phi t chc bao nhiu nhm i lao ng i v
tt c N thnh vin ca tp th u i c v i xem ca nhc hoc cho bit
khng c cch thc hin c iu .
D liu: Vo t file vn bn TICKET.INP bao gm nhiu dng, mi dng hai s
nguyn N, M cch nhau t nht mt du cch, mi dng tng ng vi mt trng
hp cn x l 1N2000, 1M200
Kt qu: a ra file TICKET.OUT, mi dng l mt s nguyn K - s ln i i
v, ng vi mt cp N, M ca d liu vo, K=-1 trong trng hp khng c cch i
v cho tt c mi ngi.
V d:
TICKET.INP
15 10
23 7
73

TICKET.OUT
-1
5
3

tng: ng dng BFS


Gi u l s ngi c v xem bng hin ti ang cn.
Gi i l s ngi c v bng tham gia thc hin cng vic. Nh vy i c kh
nng:
+ Nu u>=M th imax = M, ngc li imax= u.
+ Nu s ngi c v xem ca nhc hin ang c (N-): nu N-u >=M th imin = 0,
ngc li imin= M-(N-u).
- S ngi c v xem bng ban u l N, np N vo Queue.
Lp li:
- Ly u trong Queue.
- xt cc kh nng ca i t imin n imax:
+ v l s ngi c v xem bng sau khi thc hin xong cng vic.
Lc : v:=u-i +(M-i) = u+M-2*i
+ Nu v cha xt th np v vo Queue, nh du v v tng s ln chuyn i.
+ Nu v= 0 (ngha l s ngi c v xem bng by gi = 0) th dng li
Hoc lp li cho n khi Queue rng.
Chng trnh:
const
tfi='TICKET.INP';
tfo='TICKET.OUT';
18
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


maxN=2000;
var
fi,fo: text;
N,M: integer;
kc: array[0..maxN] of integer;
Q: array[1..maxN+1] of integer;
qf,ql: integer;
procedure InitQ;
begin
qf:=1;
ql:=1;
end;
procedure Put(u: integer);
begin
q[ql]:=u;
inc(ql);
end;
function Get: integer;
begin
Get:=q[qf];
inc(qf);
end;
function Qempty: boolean;
begin
Qempty:=(qf=ql);
end;
procedure DuyetCR;
var i,u,v,max,min: integer;
begin
for i:=0 to N do kc[i]:=-1;
InitQ;
Put(N); kc[N]:=0;
repeat
u:=Get;
if u>=M then max:=M else max:=u;
if N-u>=M then min:=0 else min:=M-(N-u);
for i:=min to max do
begin
v:=u+M-2*i;
if (kc[v]=-1) then
begin
Put(v);
kc[v]:=kc[u]+1;
if v=0 then exit;
19
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


end;
end;
until Qempty;
end;
BEGIN
assign(fi,tfi); reset(fi);
assign(fo,tfo); rewrite(fo);
while not seekeof(fi) do
begin
readln(fi,N,M);
DuyetCR;
writeln(fo,kc[0]);
end;
close(fi); close(fo);
END.

5. Chia nhm (group)


C N ngi c nh s t 1 n N. Mi ngi c th bit mt s trong s
nhng ngi cn li. Hy chia nhng ngi ny thnh 2 nhm tho mn cc iu
kin sau:
- Mi ngi phi thuc mt nhm
- Mi nhm phi c t nht mt ngi
- Mi ngi trong nhm phi bit ht nhng ngi cn li trong nhm
- S chnh lch v s lng ngi gia hai nhm cng t cng tt
Yu cu: Cho bit thng tin quan h ca mi ngui, hy ch ra cch chia nhm hoc
cho bit khng tn ti cch chia
D liu: Vo t file vn bn GROUP.INP
- Dng u tin cha s nguyn N, 1<N100
- Dng th i trong s N dng tip theo ghi danh sch nhng ngi m ngi th
i bit c di dng dy s nguyn kt thc bng s 0, cc s cch nhau t
nht mt du cch.
Kt qu: a ra file vn bn GROUP.OUT:
- Dng th nht ghi hai s nguyn K1 v K2 - s ngi trong nhm 1 v s
ngi trong nhm 2.
- Dng th 2: K1 s nguyn, xc nh nhng ngi trong nhm 1
- Dng th 3: K2 s nguyn, xc nh nhng ngi trong nhm 2
- Trong trng hp khng tn ti cch chia:file kt qu ch cha 1dng vi s -1
20
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

- Cc s trn mt dng ghi cch nhau t nht mt du cch


V d:
GROUP.INP
5
2350
14530
1250
1230
43210

const
tfi
tfo
maxN
var
a
fi,fo
N
Phan
LT
M
ok
x
Lat
T
delta

GROUP.OUT
32
135
24

=
=

'GROUP.INP';
'GROUP.OUT';
=
100;

:
:
:

array[1..maxN,1..maxN] of byte;
text;
integer;
:
array[1..maxN] of integer;
:
array[1..maxN] of integer;
:
integer;
:
boolean;
:
array[1..2,1..maxN] of integer;
:
array[1..maxN] of boolean;
:
array[1..2] of integer;
:
integer;

procedure Docdl;
var i, u: integer;
begin
fillchar(a,sizeof(a),0);
assign(fi,tfi); reset(fi);
readln(fi,N);
for i:=1 to N do
begin
repeat
read(fi,u);
if u>0 then a[u,i]:=1;
until u=0;
readln(fi);
end;
close(fi);
for i:=1 to N do a[i,i]:=1;
end;
21
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


procedure DFS(u, value: integer);
var v: integer;
begin
LT[u]:=M;
Phan[u]:=value;
x[value,M]:=x[value,M]+1;
for v:=1 to N do
if (a[u,v]=0) or (a[v,u]=0) then
begin
if (LT[v]<>0) and (Phan[v]=value) then
begin
ok:=false;
exit;
end;
if LT[v]=0 then
begin
DFS(v,3-value);
if not ok then exit;
end;
end;
end;
procedure HaiPhan;
var i: integer;
begin
for i:=1 to N do Phan[i]:=0;
for i:=1 to N do LT[i]:=0;
ok:=true;
M:=0;
for i:=1 to N do
if LT[i]=0 then
begin
inc(M);
x[1,M]:=0;
x[2,M]:=0;
DFS(i,1);
end;
end;
procedure Tim(var u: integer);
var i: integer;
begin
for i:=1 to M do
if abs(T[1]-T[2]-2*x[1,i]+2*x[2,i])<delta then
begin
u:=i;
22
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


exit;
end;
u:=0;
end;
procedure ChiaKeo;
var i,j,Tg: integer;
begin
for i:=1 to M do Lat[i]:=false;
for i:=1 to 2 do T[i]:=0;
for i:=1 to M do
for j:=1 to 2 do T[j]:=T[j]+x[j,i];
delta:=abs(T[1]-T[2]);
repeat
Tim(i);
if i>0 then
begin
Lat[i]:=not Lat[i];
T[1]:=T[1]-x[1,i]+x[2,i];
T[2]:=T[2]-x[2,i]+x[1,i];
delta:=abs(T[1]-T[2]);
Tg:=x[1,i];
x[1,i]:=x[2,i];
x[2,i]:=Tg;
end;
until i=0;
end;
procedure Inkq;
var i, u, k: integer;
begin
assign(fo,tfo); rewrite(fo);
if not ok then writeln(fo,-1) else
begin
writeln(fo,T[1],' ',T[2]);
(* In nhom thu nhat *)
for i:=1 to N do
begin
u:=LT[i];
k:=Phan[i];
if ((not Lat[u]) and (k=1)) or
((Lat[u]) and (k=2)) then write(fo,i,' ');
end;
writeln(fo);
(* In nhom thu hai *)
for i:=1 to N do
begin
23
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng


u:=LT[i];
k:=Phan[i];
if ((not Lat[u]) and (k=2)) or
((Lat[u]) and (k=1)) then write(fo,i,' ');
end;
writeln(fo);
end;
close(fo);
end;
BEGIN
Docdl;
HaiPhan;
ChiaKeo;
Inkq;
END.

24
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

C. KT LUN
Phn bi tp ng dng trong chuyn ch t mc va tm hiu, cha phn
loi, cha c nhiu bi tp v cc nhiu bi tp mc kh, cha c nhiu bi tp
cc mc kh d khc nhau phn loi cho nhiu i tng hc sinh.
Hng pht trin chuyn : tm hiu thm nhiu bi tp nhiu mc khd, phn loi bi tp.

25
Duyn

Trng N Thy

Cc thut ton tm kim trn th v mt s bi tp ng dng

D. TI LIU THAM KHO


1. Cu trc d liu v gii thut L Minh Hong
2. Ti liu gio khoa chuyn tin - H S m,
3. Tuyn chn cc bi ton tin hc - Nguyn Xun My

26
Duyn

Trng N Thy

You might also like