You are on page 1of 219

H S AM (Ch bin)

C NG L MNH HOANG NGUYN THANH HNG






ti liu gio khoa
C
C
H
H
U
U
Y
Y

N
N
T
T
I
I
N
N

quyn 1













NHA XUT BAN GO DUC VT NAM

2





























Cng ty C phn dch v xut bn Gio dc H Ni - Nh xut bn Gio dc Vit Nam
gi quyn cng b tc phm.
349-2009/CXB/43-644/GD M s : 8I746H9

3
LI NI U

B Gio dc v o to ban hnh chng trnh chuyn tin hc cho cc
lp chuyn 10, 11, 12. Da theo cc chuyn chuyn su trong chng trnh
ni trn, cc tc gi bin son b sch chuyn tin hc, bao gm cc vn c
bn nht v cu trc d liu, thut ton v ci t chng trnh.
B sch gm ba quyn, quyn 1, 2 v 3. Cu trc mi quyn bao gm: phn
l thuyt, gii thiu cc khi nim c bn, cn thit trc tip, thng dng nht;
phn p dng, trnh by cc bi ton thng gp, cch gii v ci t chng
trnh; cui cng l cc bi tp. Cc chuyn trong b sch c la chn mang
tnh h thng t c bn n chuyn su.
Vi tri nghim nhiu nm tham gia ging dy, bi dng hc sinh chuyn tin
hc ca cc trng chuyn c truyn thng v uy tn, cc tc gi la chn,
bin son cc ni dung c bn, thit yu nht m mnh s dng dy hc
vi mong mun b sch phc v khng ch cho gio vin v hc sinh chuyn
PTTH m c cho gio vin, hc sinh chuyn tin hc THCS lm ti liu tham kho
cho vic dy v hc ca mnh.
Vi kinh nghim nhiu nm tham gia bi dng hc sinh, sinh vin tham gia
cc k thi hc sinh gii Quc gia, Quc t Hi thi Tin hc tr Ton quc,
Olympiad Sinh vin Tin hc Ton quc, K thi lp trnh vin Quc t khu vc
ng Nam , cc tc gi la chn gii thiu cc bi tp, li gii c nh
hng phc v cho khng ch hc sinh m c sinh vin lm ti liu tham kho
khi tham gia cc k thi trn.
Ln u tp sch c bin son, thi gian v trnh c hn ch nn chc
chn cn nhiu thiu st, cc tc gi mong nhn c kin ng gp ca bn
c, cc ng nghip, sinh vin v hc sinh b sch c ngy cng hon
thin hn .
Cc tc gi

4




5
Chuyn 1
THUT TON
V PHN TCH THUT TON
1. Thut ton
Thut ton l mt trong nhng khi nim quan trng nht trong tin hc. Thut ng
thut ton xut pht t nh khoa hc Arp Abu Ja'far Mohammed ibn Musa al
Khowarizmi. Ta c th hiu thut ton l dy hu hn cc bc, mi bc m t
chnh xc cc php ton hoc hnh ng cn thc hin, gii quyt mt vn .
hiu y ngha ca khi nim thut ton chng ta xem xt 5 c trng sau
ca thut ton:
u vo (Input): Thut ton nhn d liu vo t mt tp no .
u ra (Output): Vi mi tp cc d liu u vo, thut ton a ra cc
d liu tng ng vi li gii ca bi ton.
Chnh xc: Cc bc ca thut ton c m t chnh xc.
Hu hn: Thut ton cn phi a c u ra sau mt s hu hn (c
th rt ln) bc vi mi u vo.
n tr: Cc kt qu trung gian ca tng bc thc hin thut ton c
xc nh mt cch n tr v ch ph thuc vo u vo v cc kt qu
ca cc bc trc.
Tng qut: Thut ton c th p dng gii mi bi ton c dng
cho.
biu din thut ton c th biu din bng danh sch cc bc, cc bc c
din t bng ngn ng thng thng v cc k hiu ton hc; hoc c th biu
din thut ton bng s khi. Tuy nhin, m bo tnh xc nh ca thut
ton, thut ton cn c vit bng cc ngn ng lp trnh. Mt chng trnh l s
biu din ca mt thut ton trong ngn ng lp trnh chn. Trong ti liu ny,
chng ta s dng ngn ng ta Pascal trnh by cc thut ton. Ni l ta
Pascal, bi v nhiu trng hp, cho ngn gn, chng ta khng hon ton tun

6
theo quy nh ca Pascal. Ngn ng Pascal l ngn ng n gin, khoa hc, c
ging dy trong nh trng ph thng.
V d: Thut ton kim tra tnh nguyn t ca mt s nguyn dng 2,
vit trn ngn ng lp trnh Pascal.
function is_prime(n):boolean;
begin
for k:=2 to n-1 do
if (n mod k=0) then exit(false);
exit(true);
end;
2. Phn tch thut ton
2.1. Tnh hiu qu ca thut ton
Khi gii mt bi ton, chng ta cn chn trong s cc thut ton mt thut ton m
chng ta cho l tt nht. Vy da trn c s no nh gi thut ton ny tt
hn thut ton kia? Thng thng ta da trn hai tiu chun sau:
1. Thut ton n gin, d hiu, d ci t (d vit chng trnh).
2. Thut ton hiu qu: Chng ta thng c bit quan tm n thi gian
thc hin ca thut ton (gi l phc tp tnh ton), bn cnh
chng ta cng quan tm ti dung lng khng gian nh cn thit lu
gi cc d liu vo, ra v cc kt qu trung gian trong qu trnh
tnh ton.
Khi vit chng trnh ch s dng mt s t ln th tiu chun (1) l quan trng,
nhng nu vit chng trnh s dng nhiu ln, cho nhiu ngi s dng th
tiu chun (2) li quan trng hn. Trong trng hp ny, d thut ton c th phi
ci t phc tp, nhng ta vn s la chn nhn c chng trnh chy nhanh
hn, hiu qu hn.
2.2. Ti sao cn thut ton c tnh hiu qu?
K thut my tnh tin b rt nhanh, ngy nay cc my tnh ln c th t tc
tnh ton hng nghn t php tnh trong mt giy. Vy c cn phi tm thut ton
hiu qu hay khng? Chng ta xem li v d bi ton kim tra tnh nguyn t ca
mt s nguyn dng 2.
function is_prime(n):boolean;
begin

7
for k:=2 to n-1 do
if (n mod k=0) then exit(false);
exit(true);
end;
D dng nhn thy rng, nu l mt s nguyn t chng ta phi mt 2 php
ton . Gi s mt siu my tnh c th tnh c trm nghn t 10

php
trong mt giy, nh vy kim tra mt s khong 25 ch s mt khong

~3170 nm. Trong khi , nu ta c nhn xt vic th t 2


n 1 l khng cn thit m ch cn th t 2 n , ta c:
function is_prime(n):boolean;
begin
for k:=2 to trunc(sqrt(n)) do
if (n mod k=0) then exit(false);
exit(true);
end;
{hm sqrt(n) l hm tnh , trunc(x) l hm lm trn x }
Nh vy kim tra mt s khong 25 ch s mt khong

~0.03 giy!
2.3. nh gi thi gian thc hin thut ton
C hai cch tip cn nh gi thi gian thc hin ca mt thut ton. Cch th
nht bng thc nghim, chng ta vit chng trnh v cho chy chng trnh vi
cc d liu vo khc nhau trn mt my tnh. Cch th hai bng phng php l
thuyt, chng ta coi thi gian thc hin thut ton nh hm s ca c d liu vo
(c ca d liu vo l mt tham s c trng cho d liu vo, n c nh hng
quyt nh n thi gian thc hin chng trnh. V d i vi bi ton kim tra
s nguyn t th c ca d liu vo l s cn kim tra; hay vi bi ton sp xp
dy s, c ca d liu vo l s phn t ca dy). Thng thng c ca d liu
vo l mt s nguyn dng , ta s dng hm s trong l c ca d
liu vo biu din thi thc hin ca mt thut ton.
Xt v d bi ton kim tra tnh nguyn t ca mt s nguyn dng (c d liu
vo l ), nu l mt s chn 2 th ch cn mt ln th chia 2 kt lun
khng phi l s nguyn t. Nu 3 khng chia ht cho 2 nhng li chia
ht cho 3 th cn 2 ln th (chia 2 v chia 3) kt lun khng nguyn t. Cn
nu l mt s nguyn t th thut ton phi thc hin nhiu ln th nht.

8
Trong ti liu ny, chng ta hiu hm s l thi gian nhiu nht cn thit
thc hin thut ton vi mi b d liu u vo c .
S dng k hiu ton hc ln m t ln ca hm . Gi s l mt s
nguyn dng, v l hai hm thc khng m. Ta vit
nu v ch nu tn ti cc hng s dng v

, sao cho , vi
mi

.
Nu mt thut ton c thi gian thc hin chng ta ni rng
thut ton c thi gian thc hin cp .
V d: Gi s

2, ta c

vi mi 1
Vy

, trong trng hp ny ta ni thut ton c thi gian thc hin


cp

.
2.4. Cc quy tc nh gi thi gian thc hin thut ton
nh gi thi gian thc hin thut ton c trnh by bng ngn ng ta
Pascal, ta cn bit cch nh gi thi gian thc hin cc cu lnh ca Pascal.
Trc tin, chng ta hy xem xt cc cu lnh chnh trong Pascal. Cc cu lnh
trong Pascal c nh ngha quy nh sau:
1. Cc php gn, c, vit l cc cu lnh (c gi l lnh n).
2. Nu S
1
, S
2
, ..., S
m
l cu lnh th
Begin S
1
; S
2
; ; S
m
; End;
l cu lnh (c gi l lnh hp thnh hay khi lnh).
3. Nu S
1
v S
2
l cc cu lnh v E l biu thc lgic th
If E then S
1
else S
2
;
l cu lnh (c gi l lnh r nhnh hay lnh If).
4. Nu S l cu lnh v E l biu thc lgic th
While E do S;
l cu lnh (c gi l lnh lp iu kin trc hay lnh While).
5. Nu S
1
, S
2
,,S
m
l cc cu lnh v E l biu thc lgic th
Repeat
S
1
; S
2
; ; S
m
;
Until E;
l cu lnh (c gi l lnh lp iu kin sau hay lnh Repeat)

9
6. Nu S l lnh, E
1
v E
2
l cc biu thc cng mt kiu th t m c
th
For i:=E
1
to E
2
do S;
l cu lnh (c gi l lnh lp vi s ln xc nh hay lnh For).
nh gi, chng ta phn tch chng trnh xut pht t cc lnh n, ri nh
gi cc lnh phc tp hn, cui cng nh gi c thi gian thc hin ca
chng trnh, c th:
1. Thi gian thc hin cc lnh n: gn, c, vit l 1
2. Lnh hp thnh: gi s thi gian thc hin ca S
1
, S
2
,,S
m
tng ng l

, . . . ,

. Khi thi gian thc hin ca lnh hp


thnh l:

, ,

.
3. Lnh If: gi s thi gian thc hin ca S
1
, S
2
tng ng l

. Khi thi gian thc hin ca lnh If l:

.
4. Lnh lp While: gi s thi gian thc hin lnh S (thn ca lnh While) l
v l s ln lp ti a thc hin lnh S. Khi thi gian thc
hin lnh While l .
5. Lnh lp Repeat: gi s thi gian thc hin khi lnh
Begin S
1
; S
2
;; S
m
; End;
l v l s ln lp ti a. Khi thi gian thc hin lnh
Repeat l .
6. Lnh lp For: gi s thi gian thc hin lnh S l v l s
ln lp ti a. Khi thi gian thc hin lnh For l .
2.5. Mt s v d
V d 1: Phn tch thi gian thc hin ca chng trnh sau:
var i, j, n :longint;
s1, s2 :longint;
BEGIN
{1} readln(n);
{2} s1:=0;
{3} for i:=1 to n do
{4} s1:=s1 + i;
{5} s2:=0;

10
{6} for j:=1 to n do
{7} s2:=s2 + j*j;
{8} writeln('1+2+..+',n,'=',s1);
{9} writeln('1^2+2^2+..+',n,'^2=',s2);
END.
Thi gian thc hin chng trnh ph thuc vo s .
Cc lnh {1}, {2}, {4}, {5}, {7}, {8}, {9} c thi gian thc hin l 1.
Lnh lp For {3} c s ln lp l , nh vy lnh {3} c thi gian thc hin l
. Tng t lnh lp For {6} cng c thi gian thc hin l .
Vy thi gian thc hin ca chng trnh l:
max1, 1, , 1, , 1, 1
V d 2: Phn tch thi gian thc hin ca on chng trnh sau:
{1} c:=0;
{2} for i:=1 to 2*n do
{3} c:=c+1;
{4} for i:=1 to n do
{5} for j:=1 to n do
{6} c:=c+1;
Thi gian thc hin chng trnh ph thuc vo s .
Cc lnh {1}, {3}, {6} c thi gian thc hin l 1.
Lnh lp For {2} c s ln lp l 2, nh vy lnh {2} c thi gian thc hin l
.
Lnh lp For {5} c s ln lp l , nh vy lnh {5} c thi gian thc hin l
. Lnh lp For {4} c s ln lp l , nh vy lnh {4} c thi gian thc hin
l

.
Vy thi gian thc hin ca on chng trnh trn l:
max1, ,


V d 3: Phn tch thi gian thc hin ca on chng trnh sau:
{1} for i:=1 to n do
{2} for j:=1 to i do
{3} c:=c+1;
Thi gian thc hin chng trnh ph thuc vo s .
Cc lnh {3} c thi gian thc hin l 1.

11
Khi i = 1, j chy t 1 n 1 lnh lp For {2} lp 1 ln
Khi i = 2, j chy t 1 n 2 lnh lp For {2} lp 2 ln

Khi i = , j chy t 1 n lnh lp For {2} lp ln
Nh vy lnh {3} c lp: 1 2. .

ln, do lnh {1} c thi


gian thc hin l


Vy thi gian thc hin ca on chng trnh trn l:


Bi tp
1.1. Phn tch thi gian thc hin ca on chng trnh sau:
for i:=1 to n do
if i mod 2=0 then c:=c+1;
1.2. Phn tch thi gian thc hin ca on chng trnh sau:
for i:=1 to n do
if i mod 2=0 then c1:=c1+1
else c2:=c2+1;
1.3. Phn tch thi gian thc hin ca on chng trnh sau:
for i:=1 to n do
if i mod 2=0 then
for j:=1 to n do c:=c+1
1.4. Phn tch thi gian thc hin ca on chng trnh sau:
a:=0;
b:=0;
c:=0;
for i:=1 to n do
begin
a:=a + 1;
b:=b + i;
c:=c + i*i;
end;
1.5. Phn tch thi gian thc hin ca on chng trnh sau:
i:=n;
d:=0;

12
while i>0 do
begin
i:=i-1;
d:=d + i;
end;
1.6. Phn tch thi gian thc hin ca on chng trnh sau:
i:=0;
d:=0;
repeat
i:=i+1;
if i mod 3=0 then d:=d + i;
until i>n;
1.7. Phn tch thi gian thc hin ca on chng trnh sau:
d:=0;
for i:=1 to n-1 do
for j:=i+1 to n do d:=d+1;
1.8. Phn tch thi gian thc hin ca on chng trnh sau:
d:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do d:=d+1;
1.9. Phn tch thi gian thc hin ca on chng trnh sau:
d:=0;
while n>0 do
begin
n:=n div 2;
d:=d+1;
end;
1.10. Cho mt dy s gm s nguyn dng, xc nh xem c tn ti mt dy
con lin tip c tng bng hay khng?
a) a ra thut ton c thi gian thc hin

.
b) a ra thut ton c thi gian thc hin

.
c) a ra thut ton c thi gian thc hin .

13
Chuyn 2
CC KIN THC C BN
1. H m
H m c hiu l tp cc k hiu v quy tc s dng tp cc k hiu biu
din v xc nh gi tr cc s. Trong h m c s 1, cc k hiu c
dng c cc gi tr tng ng 0, 1, . . , 1. Gi s c biu din:

0
,
1


trong 1 s cc ch s bn tri, l s cc ch s bn phi du phn chia
phn nguyn v phn phn ca s v cc

phi tho mn iu kin


0

.
Khi gi tr ca s c tnh theo cng thc:

. . .

. . .

1
Ch : phn bit s c biu din h m no ngi ta vit c s lm ch
s di ca s . V d:

l biu din h m .
1.1. Cc h m thng dng:
H thp phn (h c s 10) dng 10 k hiu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
V d: 28,9
10
= 2 10
1
+ 8 10
0
+ 9 10
-1

H nh phn (h c s 2) ch dng hai k hiu 0, 1
V d: 10
2
= 1 2
1
+ 0 2
0
= 2
10

101,1
2
= 1 2
2
+ 0 2
1
+ 1 2
0
+ 1 2
-1
=5,5
H c s mi su, cn gi l h hexa, s dng cc k hiu 0, 1, 2, 3, 4, 5, 6, 7, 8,
9, A, B, C, D, E, F, trong A, B, C, D, E, F c cc gi tr tng ng 10, 11, 12,
13, 14, 15 trong h thp phn
V d: AF0
16
= 10 16
2
+ 15 16
1
+ 0 16
0
=2800
10

14
1.2. Chuyn i biu din s h thp phn sang h m c s khc
chuyn i biu din mt s h thp phn sang h m c s khc, trc ht
ta tch phn nguyn v phn phn ri tin hnh chuyn i tng phn, sau
ghp li.
Chuyn i biu din phn nguyn: T (1) ta ly phn nguyn:

. . .

.
Do 0

nn khi chia cho th phn d ca php chia l


0
cn
thng s 1 s l:

1

1

2
. . .
1
. Tng t
1
l phn d ca
php chia 1 cho . Qu trnh c lp cho n khi nhn c thng bng 0.
Chuyn i biu din phn phn: T (1) ta ly phn sau du phy:

. . .

.
1

. . .


Ta nhn thy
1
chnh l phn nguyn ca kt qu php nhn, cn phn phn ca
kt qu l 2

. . .

. Qu trnh c lp cho n khi


nhn s ch s cn tm.
2. S nguyn t
Mt s t nhin 1 l s nguyn t nu c ng hai c s l 1 v .
V d cc s nguyn t: 2, 3, 5, 7, 11, 13, 17, 19, 23,
2.1. Kim tra tnh nguyn t
a) kim tra s nguyn dng 1 c l s nguyn t khng, ta kim tra
xem c tn ti mt s nguyn 2 1) m l c ca ( chia ht
) th khng phi l s nguyn t, ngc li l s nguyn t.
Nu 1 khng phi l s nguyn t, ta lun c th tch

1. V

nn

. Do ,
vic kim tra vi t 2 n 1 l khng cn thit, m ch cn kim tra t 2
n .
function is_prime(n:longint):boolean;
var k :longint;
begin
if n=1 then exit(false);

15
for k:=2 to trunc(sqrt(n)) do
if (n mod k=0) then exit(false);
exit(true);
end;
Hm is_prime(n) trn tin hnh kim tra ln lt tng s nguyn trong on
[2, ], ci tin, cn gim thiu s cc s cn kim tra. Ta c nhn xt, kim
tra s nguyn dng 1 c l s nguyn t khng, ta kim tra xem c tn
ti mt s nguyn t 2 ) m l c ca th khng phi l s
nguyn t, ngc li l s nguyn t. Thay v kim tra cc s l nguyn t ta
s ch kim tra cc s c tnh cht ging vi tnh cht ca s nguyn t, c th
s dng mt trong hai tnh cht n gin sau ca s nguyn t:
1) Tr s 2 v cc s nguyn t l s l.
2) Tr s 2, s 3 cc s nguyn t c dng 6 1 (v s c dng 6 2 th
chia ht cho 2, s c dng 6 3 th chia ht cho 3).
Hm is_prime2(n) di y kim tra tnh nguyn t ca s bng cch kim
tra xem c chia ht cho s 2, s 3 v cc s c dng 6 1 trong on [5, ].
function is_prime2(n:longint):boolean;
var k,sqrt_n:longint;
begin
if (n=2)or(n=3) then exit(true);
if (n=1)or(n mod 2=0)or(n mod 3=0) then exit(false);
sqrt_n:=trunc(sqrt(n));
k:=-1;
repeat
inc(k,6);
if (n mod k=0)or(n mod (k+2)=0) then break;
until k>sqrt_n;
exit(k>sqrt_n);
end;
b) Phng php kim tra s nguyn t theo xc sut
T nh l nh Fermat:
nu l s nguyn t v l s t nhin th


Ta c cch kim tra tnh nguyn t ca Fermat:

16
nu 2

2 th khng l s nguyn t
nu 2

2 th nhiu kh nng l s nguyn t


V d:
2

9 512 9 8 2, do s 9 khng l s nguyn t.


2

3 8 3 2, do nhiu kh nng 3 l s nguyn t, thc t 3 l s


nguyn t.
2

11 2048 11 2, do nhiu kh nng 11 l s nguyn t, thc


t 11 l s nguyn t.
2.2. Lit k cc s nguyn t trong on ,
Cch th nht l th ln lt cc s trong on 1, , ri kim tra tnh nguyn
t ca .
procedure generate(N:longint);
var m :longint;
begin
for m:=2 to N do
if is_prime(m) then writeln(m);
end;
Cch ny n gin nhng chy chm, ci tin c th s dng cc tnh cht ca
s nguyn t loi b trc nhng s khng phi l s nguyn t v khng cn
kim tra cc s ny.
Cch th hai l s dng sng s nguyn t, nh sng Eratosthene, lit k c cc
s nguyn t nhanh, tuy nhin nhc im ca cch ny l tn nhiu b nh. Cch
lm c thc hin nh sau:
Trc tin xo b s 1 ra khi tp cc s nguyn t. S tip theo s 1 l s 2, l s
nguyn t, xo tt c cc bi ca 2 ra khi bng. S u tin khng b xo sau s 2
(s 3) l s nguyn t, xo cc bi ca 3... Gii thut tip tc cho n khi gp s
nguyn t ln hn th dng li. Tt c cc s cha b xo l s nguyn t.
{$M 1100000}
procedure Eratosthene(N:longint);
const MAX = 1000000;
var i,j :longint;
Prime :array [1..MAX] of byte;
begin

17
fillchar(Prime,sizeof(Prime),0);
for i:=2 to trunc(sqrt(N)) do
if Prime[i]=0 then
begin
j:=i*i;
while j<=N do
begin
Prime[j]:=1;
j:=j+i;
end;
end;
for i:=2 to N do
if Prime[i]=0 then writeln(i);
end;
3. c s, bi s
3.1. S cc c s ca mt s
Gi s c phn tch thnh tha s nguyn t nh sau:


c s ca N c dng:

trong
0 , 0 , , 0 .
Do , s cc c s ca l 1 1 1.
V d:
100 2

, s c s ca 100 l: 2 12 1 9 c s (cc c
s l: 1, 2, 4, 5, 10, 20, 25, 50, 100).
24 2

3, s c s ca 24 l: 3 11 1 8 c s (cc c s
l: 1, 2, 3, 4, 6, 8, 12, 24).
3.2. Tng cc c s ca mt s


t 1


Gi l tng cc c ca , ta c,
1 1

1

18
1

1
1

1
1

1
1

V d: Tng cc c ca 24 l:
2

1
2 1

1
3 1
60
3.3. c s chung ln nht ca hai s
c s chung ln nht (USCLN) ca 2 s c tnh theo thut ton Euclid
, ,
function USCLN(a,b:longint):longint;
var tmp :longint;
begin
while b>0 do begin
a:=a mod b;
tmp:=a; a:=b; b:=tmp;
end;
exit(a);
end;
3.4. Bi s chung nh nht ca hai s
Bi s chung nh nht (BSCNN) ca hai s c tnh theo cng thc:
,

,

,

4. L thuyt tp hp
4.1. Cc php ton trn tp hp
1. Phn b ca trong , k hiu

, l tp hp cc phn t ca khng
thuc :

:
2. Hp ca v , k hiu , l tp hp cc phn t hoc thuc vo
hoc thuc vo :

19
:
3. Giao ca v , k hiu , l tp hp cc phn t ng thi thuc c
v
:
4. Hiu ca v , k hiu l \, l tp hp cc phn t thuc tp
nhng khng thuc .
\ :
4.2. Cc tnh cht ca php ton trn tp hp
1. Kt hp


2. Giao hon


3. Phn b


4. i ngu


4.3. Tch -cc ca cc tp hp
Tch -cc ghp hai tp hp:
, | ,
Tch -cc m rng ghp nhiu tp hp:

, ,

, 1, 2, . . ,
4.4. Nguyn l cng
Nu v l hai tp hp ri nhau th
| | || ||
Nguyn l cng m rng cho nhiu tp hp i mt ri nhau:

20
Nu

, ,

l mt phn hoch ca tp th:


|| |

| |

| |

|
4.5. Nguyn b tr
Nu v khng ri nhau th
| | || || | |
Nguyn l m rng cho nhiu tp hp:
Gi s

, ,

l cc tp hu hn:
|


trong

l tng phn t ca tt c cc giao ca tp ly t tp cho


4.6. Nguyn l nhn
Nu mi thnh phn

ca b c th t k thnh phn

, ,

kh
nng la chn 1, 2, , , th s b s c to ra l tch s ca cc kh nng
ny

. .


Mt h qu trc tip ca nguyn l nhn:
|

| |

| |

| |

|
4.7. Chnh hp lp
Xt tp hu hn gm phn t

, ,


Mt chnh hp lp chp ca phn t l mt b c th t gm phn t ca ,
cc phn t c th lp li. Mt chnh hp lp chp ca c th xem nh mt
phn t ca tch cac

. Theo nguyn l nhn, s tt c cc chnh hp lp chp


ca s l


4.8. Chnh hp khng lp
Mt chnh hp khng lp chp ca phn t l mt b c th t gm
thnh phn ly t phn t ca tp cho. Cc thnh phn khng c lp li.
xy dng mt chnh hp khng lp, ta xy dng dn tng thnh phn u tin.
Thnh phn ny c kh nng la chn. Mi thnh phn tip theo, s kh nng

21
la chn gim i 1 so vi thnh phn ng trc, do , theo nguyn l nhn, s
chnh hp khng lp chp ca s l 1 1.

1 1
!
!

4.9. Hon v
Mt hon v ca phn t l mt cch xp th t cc phn t . Mt hon v ca
phn t c xem nh mt trng hp ring ca chnh hp khng lp khi
. Do s hon v ca phn t l !
4.10. T hp
Mt t hp chp ca phn t l mt b khng k th t gm thnh
phn khc nhau ly t phn t ca tp cho.

1 1
!

!
! !

Mt s tnh cht
-

1
-

( vi 0 )
5. S Fibonacci
S Fibonacci c xc nh bi cng thc sau:

2

Mt s phn t u tin ca dy s Fibonacci:
0 1 2 3 4 5 6


0 1 1 2 3 5 8
S Fibonacci l p n ca cc bi ton:
a) Bi ton c v vic sinh sn ca cc cp th nh sau:
- Cc con th khng bao gi cht;

22
- Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c,
mt ci);
- Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp con
mi.
Gi s t u thng 1 c mt cp mi ra i th n gia thng th n s c bao
nhiu cp.
V d, n = 5, ta thy:
Gia thng th 1:
1 cp (cp ban u)
Gia thng th 2:
1 cp cp (ban u vn cha )
Gia thng th 3:
2 cp (cp ban u ra thm 1
cp con)
Gia thng th 4:
3 cp (cp ban u tip tc )
Gia thng th 5: 5 cp.
b) m s cch xp 1 thanh DOMINO c kch thc 21 ph kn bng c
kch thc 2 1.
V d: C tt c 8 cch khc nhau xp cc thanh DOMINO c kch thc 2x1
ph kn bng 2x5 6,

8.
Hm tnh s Fibonacci th bng phng php lp s dng cng thc

vi 2 v

0,

1.
function Fibo(n : longint):longint;
var fi_1, fi_2, fi, i :longint;
begin

23
if n<=1 then exit(n);

fi_2:=0; fi_1:=1;
for i:=2 to n do begin
fi:=fi_1 + fi_2;
fi_2:=fi_1;
fi_1:=fi;
end;
exit(fi);
end;
Cng thc tng qut


6. S Catalan
S Catalan c xc nh bi cng thc sau:

1
1

2!
1! !
0
Mt s phn t u tin ca dy s Catalan l:
0 1 2 3 4 5 6


S Catalan l p n ca cc bi ton:
1) C bao nhiu cch khc nhau t du ngoc m v du ngoc ng
ng n?
V d: 3 ta c 5 cch sau:
, , , ,
2) C bao nhiu cy nh phn khc nhau c ng 1 l?
V d: 3


24
3) Cho mt a gic li 2 nh, ta chia a gic thnh cc tam gic bng cch
v cc ng cho khng ct nhau trong a gic. Hi c bao nhiu cch chia nh
vy?
V d: 4

7. X l s nguyn ln
Nhiu ngn ng lp trnh cung cp kiu d liu nguyn kh ln, chng hn trong
Free Pascal c kiu s 64 bit (khong 19 ch s). Tuy nhin thc hin cc php
tnh vi s nguyn ngoi phm vi biu din c cung cp (c hng trm ch s
chng hn), chng ta cn t thit k cch biu din v cc hm thc hin cc php
ton c bn vi cc s nguyn ln.
7.1. Biu din s nguyn ln
Thng thng ngi ta s dng cc cch biu din s nguyn ln sau:
Xu k t: y l cch biu din t nhin v n gin nht, mi k t ca
xu tng ng vi mt ch s ca s nguyn ln tnh t tri qua phi.
Mng cc s: S dng mng lu cc ch s (hoc mt nhm ch s), v
mt bin ghi nhn s ch s thun tin trong qu trnh x l.
Danh sch lin kt cc s: S dng danh sch lin kt cc ch s (hoc
mt nhm ch s), cch lm ny s linh hot hn trong vic s dng b
nh.
Trong phn ny, s dng cch biu din th nht, biu din s nguyn ln bng
xu k t v ch xt cc s nguyn ln khng m.
Type bigNum = string;

25
7.2. Php so snh
so snh hai s nguyn ln a, b c biu din bng xu k t, trc
tin ta thm cc ch s 0 vo u s c s ch s nh hn hai s c s
lng ch s bng nhau. Sau s dng trc tip php ton so snh trn
xu k t.
Hm cmp so snh hai s nguyn ln a, b. Gi tr hm tr v

0
1
1


function cmp(a,b : bigNum): integer;
begin
while length(a)<length(b) do a:='0'+a;
while length(b)<length(a) do b:='0'+b;
if a = b then exit(0);
if a > b then exit(1);
exit(-1);
end;
7.3. Php cng
Php cng hai s nguyn c thc hin t phi qua tri v phn nh c mang
sang tri.
function add(a,b : bigNum): bigNum;
var sum, carry, i, x, y : integer;
c : bigNum;
begin
carry:=0;c:='';
while length(a)<length(b) do a:='0'+a;
while length(b)<length(a) do b:='0'+b;
for i:=length(a) downto 1 do
begin
x:= ord(a[i])-ord('0'); {ord('0')=48}
y:= ord(b[i])-ord('0');

sum:=x + y + carry;
carry:=sum div 10;

26
c:=chr(sum mod 10 +48)+c;
end;
if carry>0 then c:='1'+c;
add:=c;
end;
7.4. Php tr
Thc hin php tr ngc li vi vic nh php cng ta phi ch n vic vay
mn t hng cao hn. Trong hm tr di y, ch xt trng hp s ln tr s
nh hn.
function sub(a,b:bigNum):bigNum;
var c :bigNum;
s,borrow,i :integer;
begin
borrow:=0;c:='';
while length(a)<length(b) do a:='0'+a;
while length(b)<length(a) do b:='0'+b;
for i:=length(a) downto 1 do
begin
s:=ord(a[i])-ord(b[i])-borrow;
if s<0 then
begin
s:=s+10;
borrow:=1;
end else borrow:=0;
c:=chr(s +48)+c;
end;
while (length(c)>1)and(c[1]='0') do delete(c,1,1);
sub:=c;
end;
7.5. Php nhn mt s ln vi mt s nh
S nh y c hiu l s nguyn do ngn ng lp trnh cung cp (nh:
longint, integer,..). Hm multiply1(a:bigNum;b:longint):bigNum, tr v
l mt s nguyn ln (bigNum) l kt qu ca php nhn mt s nguyn ln a
(bigNum) vi mt s b (longint).

27
function multiply1(a:bigNum;b:longint):bigNum;
var i :integer;
carry,s :longint;
c,tmp :bigNum;
begin
c:='';
carry:=0;
for i:=length(a) downto 1 do
begin
s:=(ord(a[i])-48) * b + carry;
carry:= s div 10;
c:=chr(s mod 10 + 48)+c;
end;
if carry>0 then str(carry,tmp) else tmp:='';
multiply1:=tmp+c;
end;
7.6. Php nhn hai s nguyn ln
function multiply2(a,b:bigNum):bigNum;
var sum,tmp :bigNum;
m,i,j :integer;
begin
m:=-1;sum:='';
for i:=length(a) downto 1 do
begin
m:=m+1;
tmp:=multiply1(b,ord(a[i])-48);
{c th thay cu lnh tmp:=multiply1(b,ord(a[i])-48);
bng cch cng nhiu ln nh sau:
tmp:='';
for j:=1 to ord(a[i])-48 do tmp:=add(tmp,b);
nh vy hm nhn multiply2 ch gi hm cng hai s nguyn ln add}
for j:=1 to m do tmp:=tmp+'0';
sum:=add(tmp,sum);
end;
multiply2:=sum;
end;

28
7.7. Php ton chia ly thng nguyn (div)
ca mt s ln vi mt s nh
function bigDiv1(a:bigNum;b:longint):bigNum;
var s,i,hold:longint;
c:bigNum;
begin
hold:=0;s:=0; c:='';
for i:=1 to length(a) do
begin
hold:=hold*10 + ord(a[i])-48;
s:=hold div b;
hold:=hold mod b;
c:=c+chr(s+48);
end;
while (length(c)>1) and(c[1]='0') do
delete(c,1,1);
bigDiv1:=c;
end;
7.8. Php ton chia ly d (mod) ca mt s ln vi mt s nh
function bigMod1(a:bigNum;b:longint):longint;
var i,hold:longint;
begin
hold:=0;
for i:=1 to length(a) do
hold:=(ord(a[i])-48+hold*10) mod b;
bigMod1:=hold;
end;
Ch : Ta c cc cng thc sau:
1 A B mod N A mod N B mod N mod N
2 A Bmod N A mod N B mod Nmod N
7.9. Php ton chia ly thng nguyn (div) ca hai s ln
function bigDiv2(a,b:bigNum):bigNum;
var c,hold :bigNum;

29
kb :array[0..10]of bigNum;
i,k :longint;
begin
kb[0]:='0';
for i:=1 to 10 do
kb[i]:=add(kb[i-1],b);
hold:='';
c:='';
for i:=1 to length(a) do
begin
hold:=hold+a[i];
k:=1;
while cmp(hold,kb[k])<>-1 do
inc(k);
c:=c+chr(k-1+48);
hold:=sub(hold,kb[k-1]);
end;
while (length(c)>1)and(c[1]='0') do delete(c,1,1);
bigDiv2:=c;
end;
7.10. Php ton chia ly d (mod) ca hai s ln
function bigMod2(a,b:bigNum):bigNum;
var hold :bigNum;
kb :array[0..10]of bigNum;
i,k :longint;
begin
kb[0]:='0';
for i:=1 to 10 do
kb[i]:=add(kb[i-1],b);
hold:='';
for i:=1 to length(a) do
begin
hold:=hold+a[i];
k:=1;
while cmp(hold,kb[k])<>-1 do

30
inc(k);
hold:=sub(hold,kb[k-1]);
end;
bigMod2:=hold;
end;
7.11. V d tnh s Fibonacci th
S Fibonacci c xc nh bi cng thc sau:

2

Trc tin ta xy dng chng trnh tnh s Fibonacci bng kiu d liu Extended
nh sau:
function Fibo(n : longint):extended;
var i :longint;
fi_1, fi_2, fi : extended;
begin
if n<=1 then exit(n);

fi_2:=0; fi_1:=1;
for i:=2 to n do begin
fi:=fi_1 + fi_2;
fi_2:=fi_1;
fi_1:=fi;
end;
exit(fi);
end;
var n : longint;
BEGIN
write('Nhap N:'); readln(n);
writeln(Fibo(n));
END.
Chy chng trnh vi 500 ta nhn c kt qu:
1.3942322456169788E+0104, nh vy s Fibonacci th 500 c 105 ch s (c
th s dng cch biu din bng xu k t), ta xy dng chng trnh tnh s
Fibonacci ln bng cch sau:

31
- Thay kiu extended bng kiu bigNum.
- Thay cc php ton bng cc hm tnh ton s ln, xy dng cc hm tnh
ton s ln cn thit.
type bigNum = string;
function add(a,b : bigNum): bigNum;
var sum, carry, i : integer;
c : bigNum;
begin
carry:=0;c:='';
while length(a)<length(b) do a:='0'+a;
while length(b)<length(a) do b:='0'+b;
for i:=length(a) downto 1 do
begin
sum:=ord(a[i])-48+ord(b[i])-48+carry;
carry:=sum div 10;
c:=chr(sum mod 10 +48)+c;
end;
if carry>0 then c:='1'+c;
add:=c;
end;
function Fibo(n : longint):bigNum;
var i :longint;
fi_1, fi_2, fi : bigNum;
begin
if n<=1 then exit(char(n+48));

fi_2:='0'; fi_1:='1';
for i:=2 to n do begin
fi:=add(fi_1,fi_2); {fi:=fi_1 + fi_2;}
fi_2:=fi_1;
fi_1:=fi;
end;
exit(fi);
end;
var n : longint;
BEGIN

32
write('Nhap N:'); readln(n);
writeln(Fibo(n));
END.
7.12. V d tnh s


S Catalan c xc nh bi cng thc sau:

1
1

2!
1! !
0
Rt gn t v mu cho 1! ta c:

2 3 . . 2
1 2 . .

Ta s tnh t s bng cch s dng hm nhn s ln vi s nh, sau s dng
hm chia s ln cho s nh c kt qu cn tnh.
type bigNum =string;
function multiply1(a:bigNum;b:longint):bigNum;
var i :integer;
carry,s :longint;
c,tmp :bigNum;
begin
c:='';
carry:=0;
for i:=length(a) downto 1 do
begin
s:=(ord(a[i])-48) * b + carry;
carry:= s div 10;
c:=chr(s mod 10 + 48)+c;
end;
if carry>0 then str(carry,tmp) else tmp:='';
multiply1:=tmp+c;
end;
function bigDiv1(a:bigNum;b:longint):bigNum;
var s,i,hold:longint;
c:bigNum;
begin
hold:=0;s:=0; c:='';

33
for i:=1 to length(a) do
begin
hold:=hold*10 + ord(a[i])-48;
s:=hold div b;
hold:=hold mod b;
c:=c+chr(s+48);
end;
while (length(c)>1) and(c[1]='0') do
delete(c,1,1);
bigDiv1:=c;
end;
var n,k :longint;
s :bigNum;
BEGIN
write('Nhap N:'); readln(n);
s:='1';
for k:=(n+2) to 2*n do s:=multiply1(s,k); {tnh t s}
for k:=1 to n do s:=bigDiv(s,k); {chia cho mu s}
writeln(s);
END.
Tuy nhin, ta c th rt gn hon ton mu s ca phn s trn v ch cn s dng
hm nhn s ln vi s nh, chng trnh s chy nhanh hn.
Bi tp
2.1. Cho s l mt xu ch gm 2 k t '0' hoc '1' m t mt s nguyn khng m
h c s 2, hy chuyn s sang h c s 16 ( di xu s khng vt
qu 200).
V d: 10101100
2
=AC
16

101010111100000100100011
2
=ABC123
16

2.2. Cho s nguyn dng N (N10
9
)
a) Phn tch N thnh tha s nguyn t
b) m s c ca N
c) Tnh tng cc c ca N
2.3. a ra nhng s 10
6
m cch kim tra tnh nguyn t ca Fermat b sai.

34
2.4. S dng sng s nguyn t lit k cc s nguyn t trong on ,
2.5. Ngi ta nh ngha mt s nguyn dng N c gi l s p nu N tho
mn mt trong hai iu kin sau:
- N bng 9
- Gi f(N) l tng cc ch s ca N th f(N) cng l s p
Cho s nguyn dng N (N 10

, hy kim tra xem N c phi l s p


khng?
2.6. Dng cch biu din s nguyn ln bng xu v thm thng tin du (sign=1
nu s ln l s khng m, sign=-1 nu s ln l s m) x l s nguyn
ln c du nh sau:
type bigNum = record
sign : longint;
num : string;
end;
Hy xy dng cc hm x l s nguyn ln c du.
2.7. Dng cch biu din s nguyn ln bng mng (mi phn t ca mng l mt
nhm cc ch s).
a) Hy xy dng cc hm x l s nguyn ln.
b) S dng hm nhn s nguyn ln vi s nh tnh N! vi N2000.
2.8. Tm K ch s cui cng ca M
N
(0< K 9, 0 M, N 10
6
)
V d: K=2, M=2, N=10, ta c 2
10
=1024, nh vy 2 ch s cui cng ca
2
10
l 24
2.9. Cho N (N 10) nguyn dng

, ,

10

. Tm c s chung
ln nht, bi s chung nh nht ca s trn (ch : BSCNN c th rt
ln).
2.10. Cho hai s nguyn khng m A, B (0AB10
200
), tnh s lng s
Fibonacci trong on [A, B].
2.11. Cho s nguyn dng N (N10
100
), hy tch N thnh tng cc s Fibonacci
i mt khc nhau.
V d: N=16=1+5+13
2.12. Cho N l mt s nguyn dng khng vt qu 10
9
. Hy tm s ch s 0 tn
cng ca N!

35
2.13. Cho s l mt xu m t s nguyn khng m h c s a, hy chuyn s
sang h c s b (1 a, b 16, di xu s khng vt qu 50).
2.14. Xy dng hm kim tra s nguyn dng N c phi l s chnh phng
khng? (N<10
100
)
2.15. Tnh

(0< 2000)
2.16. Tnh Catalan

( 2000
2.17. Hy m s cch t qun xe ln bn c sao cho khng c qun no
n c nhau. 1 100
2.18. Gi thit N l s nguyn dng. S nguyn M l tng ca N vi cc ch s
ca n. N c gi l ngun ca M. V d, N = 245, khi M = 245 + 2 + 4
+ 5 = 256. Nh vy, ngun ca 256 l 245. C nhng s khng c ngun v
c s li c nhiu ngun. V d, s 216 c 2 ngun l 198 v 207.
Cho s nguyn M (M c khng qu 100 ch s) hy tm ngun nh nht ca
n. Nu M khng c ngun th a ra s 0.
2.19. Tnh s c v tng cc c ca N! (N100)
2.20. Cho mt chic cn hai a v cc qu cn c khi lng 3
0
, 3
1
, 3
2
,
Hy chn cc qu cn c th cn c vt c khi lng N (N10
100
)
V d: cn cn vt c khi lng N=11 ta cn s dng cc qu cn sau:
- Cn bn tri: qu cn 3
1
v 3
2

- Cn bn phi: qu cn 3
0
v vt N=11
2.21. m s lng dy nh phn khc nhau di m khng c 2 s 1 no
ng cnh nhau?
V d: 3, ta c 5 dy 000, 001, 010, 100, 101
2.22. Cho xu s ch gm k t t 'a' n 'z' ( di xu s khng vt qu 100), hy
m s hon v khc nhau ca xu .
V d: s='aba', ta c 3 hon v 'aab','aba','baa'
2.23. John Smith quyt nh nh s trang cho quyn sch ca anh ta t 1 n N.
Hy tnh ton s lng ch s 0 cn dng, s lng ch s 1 cn dng,.., s
lng ch s 9 cn dng.
D liu vo trong file: digits.inp gm 1 dng duy nht cha mt s N
(N10
100
).

36
Kt qu ra file digits.out c dng gm 10 dng, dng th nht l s lng
ch s 0 cn dng, dng th hai l s lng ch s 1 cn dng,.., dng th
10 l s lng ch s 9 cn dng.
2.24. TAM GIC S ( thi hc sinh gii H Ty 2006)
Hnh bn m t mt tam gic s
c s hng N=5. i t nh (s 7)
n y tam gic bng mt ng
gp khc, mi bc ch c i
t s hng trn xung mt
trong hai s ng k bn phi hay
bn tri hng di, v tnh tch
cc s trn ng i li ta c
mt tch.
V d: ng i 7 8 1 4 6 c tch l S=1344, ng i 7 3 1 7 5 c tch l
S=735.
Yu cu: Cho tam gic s, tm tch ca ng i c tch ln nht
D liu: Vo t file vn bn TGS.INP:
Dng u tin cha s nguyn n, (0<n<101)
N dng tip theo, t dng th 2 n dng th N+1: dng th i c (i-1) s
cch nhau bi du cch (cc s c gi tr tuyt i khng vt qu 100)
Kt qu: a ra file vn bn TGS.OUT mt s nguyn l tch ln nht tm
c
TGS.INP TGS.OUT
5
7
3 8
8 1 0
2 7 4 4
4 5 -2 6 5
5880
2.25. HI NM (bi thi Olympic Sinh vin 2009, khi chuyn)
Mt chu gi hng ngy c m giao nhim v n thm b ni. T nh
mnh n nh b ni c b phi i qua mt khu rng c rt nhiu loi nm.
Trong s cc loi nm, c ba loi c th n c. C b nh s ba loi nm
n c ln lt l 1, 2 v 3. L mt ngi chu hiu tho cho nn c b

37
quyt nh mi ln n thm b, c s hi t nht hai loi nm n c
nu sp cho b. Khu rng m c b i qua c chia thnh li vung
gm m hng v n ct. Cc hng ca li c nh s t trn xung di
bt u t 1, cn cc ct nh s t tri sang phi, bt u t 1. nm
giao ca hng i v ct j c ta (i, j). Trn mi vung, tr (1,1) v
(m, n) cc cn li hoc c nm c v c b khng dm i vo (nh du
l -1), hoc l c ng mt loi nm c th n c (nh du bng s hiu
ca loi nm ). Khi c b i vo mt vung c nm n c th c b
s hi loi nm mc trn . Xut pht t (1,1), n c nh b ni
(m, n) mt cch nhanh nht c b lun i theo hng sang phi hoc
xung di.
Vic i thm b v hi nm trong rng su gp nguy him bi c mt con
cho si lun theo di v mun n tht c b. phng trnh ch si theo di
v n tht, c b quyt nh mi ngy s i theo mt con ng khc nhau
(hai con ng khc nhau nu chng khc nhau t nht mt ).
Yu cu: Cho bng mn vung m t trng thi khu rng. Hy tnh s con
ng khc nhau c b n thm b ni theo cch chn ng i nu
trn.
D liu: Vo t file vn bn MUSHROOM.INP:
- Dng u cha 2 s m, n (1 < m, n <101),
- m dng tip tip theo, mi dng cha n s nguyn cho bit thng tin v
cc ca khu rng. (ring gi tr hai (1,1) v (m, n) lun lun
bng 0 cc cn li c gi tr bng -1, hoc 1, hoc 2, hoc 3).
Hai s lin tip trn mt dng cch nhau mt du cch.
Kt qu: a ra file vn bn MUSHROOM.OUT cha mt dng ghi mt s
nguyn l kt qu bi ton.
V d:
MUSHROOM.INP MUSHROOM.OUT
3 4
0 3 -1 2
3 3 3 3
3 1 3 0
3
2.26. H THNG N MU (Tin hc tr bng B nm 2009)
trang tr cho l k nim 15 nm hi thi Tin hc tr ton quc, ban t chc
dng mt h thng n mu gm n nh s t 1 n . Mi n c

38
kh nng sng mu xanh hoc mu . Cc n c iu khin theo quy
tc sau:
- Ban u tt c cc n u sng mu xanh.
- Sau khi kt thc chng trnh th nht ca l k nim, tt c cc n c s
th t chia ht cho 2 s i muSau khi kt thc chng trnh th , tt c
cc n c s th t chia ht cho 1 s i mu (n xanh i thnh mu
cn n i thnh mu xanh)
Minh, mt th sinh d l k nim pht hin c quy lut iu khin n
v rt thch th vi h thng n trang tr ny. Vo lc chng trnh th
ca bui l va kt thc, Minh nhm tnh c ti thi im c bao
nhiu n xanh v bao nhiu n . Tuy nhin v khng c my tnh nn
Minh khng chc chn kt qu ca mnh l ng. Cho bit hai s v
, 10

, em hy tnh li gip Minh xem khi chng trnh th ca


bui l va kt thc, c bao nhiu n mu .
V d vi 10; 3.
Thi im Trng thi cc n
Bt u Xanh: 1 2 3 4 5 6 7 8 9 10
:
Sau chng trnh 1 Xanh: 1 3 5 7 9
: 2 4 6 8 10
Sau chng trnh 2 Xanh: 1 5 6 7
: 2 3 4 8 9 10
Sau chng trnh 3 Xanh: 1 4 5 6 7 8
: 2 3 9 10
Vy c 4 n sau chng trnh th 3.


39
Chuyn 3
SP XP
Sp xp l qu trnh b tr li v tr cc i tng ca mt danh sch theo mt trt
t nht nh. Sp xp ng vai tr rt quan trng trong cuc sng ni chung v
trong tin hc ni ring, th hnh dung xem, mt cun t in, nu cc t khng
c sp xp theo th t, s kh khn nh th no trong vic tra cu cc t. Theo
D.Knuth th 40% thi gian tnh ton ca my tnh l dnh cho vic sp xp.
Khng phi ngu nhin thut ton sp xp nhanh (Quick Sort) c bnh chn l
mt trong 10 thut ton tiu biu ca th k 20.
Do c im d liu (kiu s hay phi s, kch thc b hay ln, lu tr b nh
trong hay b nh ngoi, truy cp tun t hay ngu nhin...) m ngi ta c cc
thut ton sp xp khc nhau. Trong chuyn ny, chng ta ch quan tm n
cc thut ton sp xp trong trng hp d liu c lu tr b nh trong
(ngha l ton b d liu cn sp xp phi c a vo b nh chnh ca my
tnh).
1. Pht biu bi ton
Gi s cc i tng cn sp xp c biu din bi bn ghi gm mt s trng.
Mt trong cc trng c gi l kho sp xp. Kiu ca kho l kiu c th
t (chng hn, kiu s nguyn, kiu s thc,)
const
MAX =;
type
object = record
key : keyType;
[cc trng khc]
end;
TArray = array[1..MAX]of object;
var
a : TArray;
n : longint;

40
Bi ton sp xp c pht biu nh sau: Cho mng cc i tng, cn sp xp
li cc thnh phn (phn t) ca mng nhn c mng mi vi cc thnh
phn c cc gi tr kho tng dn:
1. 2. .
2. Cc thut ton sp xp thng dng
Hai thut ton hay c s dng nhiu trong thc t l thut ton sp xp ni
bt (BUBBLE SORT) v thut ton sp xp nhanh (QUICK SORT).
2.1 Thut ton sp xp ni bt (Bubble Sort)
tng c bn ca thut ton l tm v i ch cc cp phn t k nhau sai th t
(phn t ng trc c kho ln hn kho ca phn t ng sau) cho n khi
khng tn ti cp no sai th t (dy c sp xp).
C th:
- Lt 1: ta xt t cui dy, nu gp 2 phn t k nhau m sai th t th i
ch chng cho nhau. Sau lt 1, phn t c kho nh th nht c a v
v tr 1.
- Lt 2: ta xt t cui dy (ch n phn t th 2), nu gp 2 phn t k
nhau m sai th t th i ch chng cho nhau. Sau lt 2, phn t c kho
nh th hai c a v v tr 2.
- Lt i: ta xt t cui dy v (ch n phn t th i, v phn u dy t 1
n i-1 c xp ng th t), nu gp 2 phn t k nhau m sai th t
th i ch chng cho nhau. Sau lt i, phn t c kho nh th i c a
v v tr i.
Xong lt th n-1 th dy c sp xp xong.
procedure BoubbleSort;
var i, j : integer;
tmp : object;
begin
for i := 1 to n-1 do
for j := n downto i+1 do
if a[j-1].key > a[j].key then
begin
tmp := a[j];

41
a[j]:= a[j-1];
a[j-1]:= tmp;
end;
end;
nh gi phc tp
S php ton so snh 1. . c dng nh gi hiu sut
thut ton v mt thi gian cho thut ton sp xp ni bt. Ti lt th i ta cn
php so snh. Nh vy tng s php so snh cn thit:
1 2 1
1
2

Thut ton c phc tp


Mt thut ton sp xp n gin, hay s dng khc cng cho phc tp


for i:=1 to n-1 do
for j:=i+1 to n do
if a[i].key>a[j].key then begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
end;
2.2. Thut ton sp xp nhanh (Quick Sort)
tng ca thut ton nh sau: sp xp dy coi nh l sp xp on t ch s
1 n ch s . sp xp mt on trong dy, nu on ch c mt phn t th
dy c sp xp, ngc li ta chn mt phn t trong on lm "cht",
mi phn t c kho nh hn kho ca cht c xp vo v tr ng trc
cht, mi phn t c kho ln hn kho ca cht c xp vo v tr ng sau
cht. Sau php hon chuyn nh vy th on ang xt c chia lm hai on m
mi phn t trong on u u c kho kho ca cht v mi phn t trong
on sau u c kho kho ca cht. Tip tc sp xp kiu nh vy vi 2
on con, ta s c on cho c sp xp theo chiu tng dn ca kho.
C th:
Gi s phi sp xp on c ch s t L n H:

42
- chn l mt phn t ngu nhin trong on L..H (c th chn l phn
t gia on, ngha l a[(L+H) div 2])
- cho i chy t L sang phi, j chy t H sang tri; nu pht hin mt cp
ngc th t: i j v . . . th i ch 2 phn t
; cho n khi i>j. Lc dy tnh trng: kho cc phn t on L..i
kho ca ; kho ca cc phn t on j..H kho ca . Tip tc sp xp
nh vy vi 2 on L..j v i..H.
Th tc QuickSort(L,H) sau, sp xp on t L ti H, sp xp dy s ta
gi QuickSort(1,n)
procedure QuickSort(L,H:longint);
var i,j :longint;
x,tmp :object;
begin
i:=L;
j:=H;
//x:=a[random(H-L+1)+L];
x:=a[(L+H) div 2];
repeat
while a[i].key<x.key do inc(i);
while a[j].key>x.key do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);
dec(j);
end;
until i>j;
if L<j then QuickSort(L,j);
if i<H then QuickSort(i,H);
end;
nh gi phc tp
Vic chn cht phn on quyt nh hiu qu ca thut ton, nu vic chn
cht khng tt rt c th vic phn on b suy bin thnh trng hp xu (phn

43
thnh hai on m s phn t ca hai on chnh lch nhiu) khin Quick Sort
hot ng chm. Cc tnh ton phc tp chi tit cho thy thut ton Quick sort:
- C thi gian thc thi c trong trng hp trung bnh.
- C thi gian thc thi c

trong trng hp xu nht (2 on c


chia thnh mt on n-1 v mt on 1 phn t). Kh nng xy ra trng
hp ny l rt t, cn nu chn cht ngu nhin, hu nh s khng xy ra.
2.3. Nhn xt
Nu chng trnh t gi ti th tc sp xp v ch trn tp d liu nh, th vic s
dng mt thut ton phc tp (tuy c hiu qu hn) c th khng cn thit, khi
c th s dng thut ton n gin c phc tp

, d ci t. Tuy nhin,
v phc tp

, ngha l thi gian thc hin tng ln gp 4 khi s lng


phn t tng ln gp i. Do , trong trng hp sp xp trn tp d liu ln nn
s dng thut ton sp xp nhanh c phc tp c .
3. Sp xp bng m phn phi (Distribution Counting)
Trong trng hp kho cc phn t a1, a2 , . . . , an l cc s nguyn nm
trong khong t 0 ti ta c thut ton n gin v hiu qu nh sau:
Xy dng dy 0, 1, , , trong l s ln xut hin kho trong
dy.
for V := 0 to K do c[V] := 0;{Khi to dy c}
for i := 1 to n do c[a[i].key] := c[a[i].key] + 1;
Nh vy, sau khi sp xp:
- Cc phn t c kho bng 0 ng trong on t v tr 1 ti v tr 0.
- Cc phn t c kho bng 1 ng trong on t v tr 0 1 ti v tr
0 1.
- Cc phn t c kho bng 2 ng trong on t v tr 0 1 1 ti
v tr 0 1 2.
...
- Cc phn t c kho bng trong on ng t v tr 0 1
1 1 ti v tr 0 1 1 .
...
- Cc phn t c kho bng trong on ng t v tr 0 1
1 1 ti v tr 0 1 .
V d: vi dy gm 8 phn t c dy kho bng : 2, 0, 2, 5, 1, 2, 0, 3 ta c

44
0 1 2 3 4 5
2 1 3 1 0 1
Sau khi sp xp, cc phn t c kho bng 0 s nm t v tr 1 n v tr 2, phn t
c kho bng 1 nm v tr 3, cc phn t c kho bng 2 nm t v tr 4 n v tr
6, phn t c kho bng 3 nm v tr 7, cc phn t c kho bng 5 nm v
tr 8.
Dy kho sau khi sp xp: 0, 0, 1, 2, 2, 2, 3, 5
phc tp ca thut ton l: ,
4. Mt s v d ng dng thut ton sp xp
V d 1: Gi tr nh th
Cho dy

, ,

, cc s i mt khc nhau v s nguyn dng 1


. Hy a ra gi tr nh th trong dy.
V d dy gm 5 phn t: 5, 7, 1, 3, 4 v 3 th gi tr nh th l 4.
Gii
Sp xp dy theo gi tr tng dn, s ng th ca dy l gi tr nh th . Nu
5000 c th s dng thut ton sp xp ni bt, nhng nu 5000 th nn
s dng thut ton sp xp nhanh.
Ta c th tm c gi tr nh th hiu qu hn (khng cn phi sp xp li c
dy s) c th:
+ Trong thut ton sp xp ni bt ta ch cn sp xp n phn t th , khi
phn t th chnh l phn t c kho nh th .
for i:=1 to k do // i chy n k
for j:=n downto i+1 do
if a[j-1]>a[j] then
begin
tmp:=a[j];
a[j]:=a[j-1];
a[j-1]:=tmp;
end;
+ Trong thut ton Quick Sort, ta thy rng:
Nu <L<=H th on t L n H khng cn sp xp v on ny khng
nh hng n v tr th .

45
Nu L<=H< th on t L n H cng khng cn sp xp v on ny
khng nh hng n v tr th .
Nu L<=<=H th ta s x l tip trong on ny.
procedure QuickSort(L,H:longint);
var i,j :longint;
x,tmp :longint;
begin
if (L<=K) and (H>=K) then
begin
i:=L;
j:=H;
x:=a[(L+H) div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);
dec(j);
end;
until i>j;
if L<j then QuickSort(L,j);
if i<H then QuickSort(i,H);
end;
end;
Sau khi gi v thc hin th tc QuickSort(1,n) th s ng th chnh l gi tr
nh th .
Ch : khi l s nh th ( 2 1) ca dy

, ,

th hm
|

| |

| |

|
t gi tr nh nht

46
V d 2: Tm kim
Cho dy c sp tng dn

. . .

v s . Hy a ra ch s i m

hoc a ra i=0 nu khng c phn t no c gi tr bng .


Gii
Thut ton tm kim nh phn c th tm phn t c gi tr bng trn mng
c sp xp mt cch hiu qu trong thi gian . Thut ton nh sau:
Gi s cn tm trong on , 1, . . , vi gi tr cn tm kim l ,
trc ht ta xem xt vi gi tr ca phn t nm gia dy, 2
Nu

< X th c ngha l on t ti ch cha cc
phn t c gi tr < X, ta tin hnh tm kim tip vi on t 1
n
Nu > X th c ngha l on t ti ch cha cc
phn t c gi tr > X, ta tin hnh tm kim tip vi on t n
1
Nu = X th vic tm kim thnh cng (kt thc qu trnh tm
kim).
Qu trnh tm kim s tht bi nu n mt bc no , on tm kim l rng
( )
function BinarySearch(X: longint): longint;
var L, H, mid: longint;
begin
L := 1; H := n;
while L H do
begin
mid := (L + H) div 2;
if a[mid] = X then exit(mid);

if a[mid] < X then L := mid + 1
else H := mid - 1;
end;
exit(0);
end;

47
V d 3: Thng k
Cho dy

, ,

. Hy m s lng gi tr khc nhau c trong dy v a ra


s ln lp ca gi tr xut hin nhiu nht.
V d: dy gm 8 s: 6, 7, 1, 7, 4, 6, 6, 8 th dy c 5 gi tr khc nhau v s ln
lp ca gi tr xut hin nhiu nht trong dy l 3.
Gii
Cc cng vic trn s c thc hin n gin nu mng c sp xp, khi
cc phn t c gi tr bng nhau s ng cnh nhau (lin tip nhau).
{ Hm countValue tr v s gi tr khc nhau trong mng a c n phn t sp
xp}
function countValue(a : TArray;n : longint):longint;
var i,count :longint;
begin
count:=1;
for i:=2 to n do
if a[i-1]<>a[i] then inc(count);
countValue := count;
end;
{ Hm highestFrequency tr v s ln lp ca gi tr xut hin nhiu nht
trong mng a c n phn t sp xp}
function highestFrequency(a:TArray; n:longint):longint;
var i,count,rslt :longint;
begin
rslt:=1;
count:=1;
for i:=2 to n do begin
if a[i] <> a[i-1] then count:=1
else inc(count);
if count>rslt then rslt:=count;
end;
highestFrequency := rslt;
end;
V d 4. Xt dy gm 2 10

s nguyn

, ,

nh
ngha nh sau:

48


1, nu 1 2

mod 128, nu 2


Hy cho bit nu sp xp dy theo th t khng gim th s th c
gi tr l bao nhiu?
Gii
Ta nhn thy

c gi tr nguyn v 0

127, ta s s dng thut ton m


phn phi nh sau:
- Xy dng dy v dy 0, 1, , 127 , trong l s ln xut
hin gi tr trong dy .
- Gi tr th ca dy sau khi sp xp l gi tr nh nht tho mn
0 1
Ch : S dng 2

1 thay cho 2

, chng trnh s chy


nhanh hn.
const maxValue =128 1;
var fi_2, fi_1, fi :longint;
i, v, n, k, cv, P :longint;
c :array[0..maxValue]of longint;
BEGIN
write('Nhap n, k:');readln(n,k);
fi_1:=1; fi_2:=1;
fillchar(c,sizeof(c),0);
c[fi_1]:=c[fi_1]+1;
c[fi_2]:=c[fi_2]+1;
for i:=3 to n do begin
fi:=(fi_1+fi_2) and maxValue;
{write(fi:4);}
c[fi]:=c[fi]+1;
fi_2:=fi_1;
fi_1:=fi;
end;
cv:=0;
for v:=0 to maxValue do begin
cv:=cv+c[v];
if cv >= k then begin
P:=v;

49
break;
end;
end;
writeln(P)
END.
V d 5. Cho dy gm 30000 s t nhin khng vt qu 10

, tm s t
nhin nh nht khng xut hin trong dy.
D liu vo trong file SN.INP c dng:
- Dng u l s nguyn
- Dng th hai gm s
Kt qu ra file SN.OUT c dng: s t nhin nh nht khng xut hin trong dy.
SN.INP SN.OUT
5
5 0 3 1 4
2
Gii
Ta c nhn xt sau: s t nhin nh nht khng xut hin trong dy s nm trong
on [0, n]. Do , ta s dng mng c:array[0..30000]of longint;
vi c[x]l s ln xut hin ca x trong dy, nu c[x]=0 tc l x khng xut
hin trong dy.
const Limit =30000;
fi ='SN.INP';
fo ='SN.OUT';
var c :array[0..Limit]of longint;
n :longint;
i,x :longint;
f :text;
BEGIN
fillchar(c,sizeof(c),0);
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do begin
read(f,x);
if x<=n then inc(c[x]);
end;

50
close(f);
for i:=0 to n do
if c[i]=0 then begin
x:=i;
break;
end;
assign(f,fo); rewrite(f);
write(f,x);
close(f);
END.
V d 6. Cho xu s ( di khng vt qu 10
6
) ch gm 2 k t 'A' v 'B'. m s
cch chn cp ch s (i,j) m xu con lin tip t k t th i n k t th j ca xu
s c s lng k t 'A' bng s lng k t 'B'.
D liu vo trong file AB.INP c dng: gm mt dng duy nht cha xu s
Kt qu ra file AB.OUT c dng: gm mt dng duy nht cha mt s l kt
qu bi ton.
AB.INP AB.OUT
ABAB 4
Gii
const MAX =1000000;
fi ='AB.INP';
fo ='AB.OUT';
var s :ansistring;
c :array[-MAX..MAX]of longint;
f :text;
i, sum :longint;
count :int64;
BEGIN
assign(f,fi); reset(f);
read(f,s);
close(f);
fillchar(c,sizeof(c),0);
c[0]:=1;
sum:=0;

51
count:=0;
for i:=1 to length(s) do begin
if s[i]='A' then sum:=sum - 1
else sum:=sum + 1;
count:=count + c[sum];
inc(c[sum]);
end;
assign(f,fo); rewrite(f);
write(f,count);
close(f);
END.
Bi tp
3.1. Cho mt danh sch hc sinh (1 200), mi hc sinh c thng tin sau:
- H v tn: L mt xu k t di khng qu 30 (cc t cch nhau mt
du cch)
- im: L mt s thc
A) a ra danh sch h v tn sp xp theo th t abc (u tin tn, h,
m)
B) C bao nhiu tn khc nhau trong danh sch, lit k cc tn .
C) Chn nhng hc sinh c th hng 1, 2, 3 im cao nht trong danh sch
trao hc bng, hy cho bit tn nhng hc sinh .
V d
D liu vo Kt qu cu A Kt qu
cu B
Kt qu cu
C
6
Vu Anh Quan
8.9
Nguyen Van
Chung
8.7
Hoang Trong
Quynh
8.5
Nguyen Van
Chung
Cong Hoang
Dinh Quang
Hoang
Dinh Quang
Huy
Vu Anh Quan
Hoang Trong
5
Chung
Hoang
Huy
Quan
Quynh
Vu Anh Quan
Dinh Quang
Huy
Dinh Quang
Hoang
Nguyen Van
Chung

52
Dinh Quang
Hoang
8.7
Dinh Quang
Huy
8.8
Cong Hoang
8.0
Quynh

3.2. Cho dy s gm s nguyn

. . .


A) a ra thut ton c phc tp tm 2 ch s m

0.
B) a ra thut ton c phc tp

tm 3 ch s
m

0.
C) a ra thut ton c phc tp tm 2 ch s m

0.
D) a ra thut ton c phc tp

tm 3 ch s m

0.
3.3. Cho mt xu s ( di khng qu 200) ch gm cc k t n , m s
lng xu con lin tip khc nhau nhn c t xu s.
V d: s='', ta c cc xu con lin tip khc nhau l:
, , , , , , , s lng xu con lin tip khc nhau
l 7.
3.4. Vit lin tip cc s t nhin t 1 n ta c mt s nguyn . V d
=15 ta c =123456789101112131415. Hy tm cch xo i ch s
ca s nhn c s ' l ln nht.
3.5. Xt tp tt c cc s hu t trong on [0,1] vi mu s khng vt qu
N 1 100.
V d tp 5: 0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
Sp xp cc phn s trong tp theo th t tng dn, a ra phn s
th .
3.6. Cho xu s ( di khng vt qu 10
6
) ch gm cc k t n ,
A) C bao nhiu loi k t xut hin trong s

53
B) a ra mt k t xut hin nhiu nht trong xu s v s ln xut hin ca
k t .
3.7. Cho 2 dy

. . .

. . .

, hy a ra thut ton c
phc tp c dy

l dy trn ca hai dy trn.


3.8. Cho dy s gm 10000 s nguyn

, ,

(|

| 10

, tm s
nguyn bt k |

| |

| |

| t gi tr nh
nht, c bao nhiu gi tr nguyn khc nhau tho mn.
V d 1: dy gm 5 s 3, 1, 5, 4, 5, ta c duy nht mt gi tr 4 t
gi tr nh nht bng 6.
V d 2: dy gm 6 s 3, 1, 7, 2, 5, 7 ta c ba gi tr nguyn ca l 3, 4, 5
t gi tr nh nht bng 13.
3.9. Cho 10000 im trn mt phng Oxy, im th i c ta l

. Ta nh ngha khong cch gia 2 im P(x


P
, y
P
) v Q(x
Q
, y
Q
) bng
|

| |

|. Hy tm im c ta nguyn m tng khong


cch (theo cch nh ngha trn) t ti N im cho l nh nht
(|

|, |

| nguyn khng vt qu10

)
3.10. Cho 10000 on thng trn trc s vi cc im u

v di

|,

l nhng s nguyn v khng vt qu 10

. Tnh tng di
trn trc s b ph bi on trn.
V d: c 3 on

5,

10;

0,

6;

100,

10
th tng di trn trc s b ph bi 3 on trn l: 21
3.11. Cho N (N 300 im trn mt phng Oxy, im th i c ta l (x
i
, y
i
).
Hy m s cch chn 4 im trong N im trn m 4 im to thnh 4
nh ca mt hnh ch nht. (|x
i
|, |y
i
| nguyn khng vt qu 1000)
V d: c 5 im (0, 0), (0, 1), (1, 0), (-1, 0), (0, -1) c duy nht 1 cch chn
4 im m 4 im to thnh 4 nh ca mt hnh ch nht.
3.12. Cho 10000 on s nguyn

, hy tm mt s m s
thuc nhiu on s nguyn nht.
V d: c 5 on 0,10, 2,3, 4,7, 3,5, 5,8, ta chn s 5 thuc 4 on
0,10, 4,7, 3,5, 5,8.
3.13. Cho dy gm 10000 s

, . . ,

. Hy tm dy con lin tip di


nht c tng bng 0. |

| 10



54
V d: dy gm 5 s 2, 1, -2, 3, -2 th dy con lin tip di nht c tng bng
0 l: 1, -2, 3, -2
3.14. ESEQ
Cho dy s nguyn A gm N phn t A
1
, A
2
, .., A
N
, tm s cp ch s i, j tho
mn:
1
i N
p q
p q j
A A
= =
=

vi 1 i < j N
D liu vo trong file ESEQ.INP c dng:
- Dng u l s nguyn dng N (2 N 10
5
)
- Dng tip theo cha N s nguyn A
1
, A
2
, .., A
N
(|A
i
|<10
9
), cc s cch
nhau mt du cch.
Kt qu ra file ESEQ.OUT c dng: gm mt s l s cp tm c.
ESEQ.INP ESEQ.OUT
3
1 0 1
3
3.15. GHP S
Cho n s nguyn dng a
1
, a
2
, . . .,a
n
(1 < n 100), mi s khng vt qu
10
9
. T cc s ny ngi ta to ra mt s nguyn mi bng cch ghp tt c
cc s cho, tc l vit lin tip cc s cho vi nhau. V d, vi n = 4
v cc s 123, 124, 56, 90 ta c th to ra cc s mi sau: 1231245690,
1241235690, 5612312490, 9012312456, 9056124123,... C th d dng
thy rng, vi n = 4, ta c th to ra 24 s mi. Trong trng hp ny, s
ln nht c th to ra l 9056124123.
Yu cu: Cho n v cc s a
1
, a
2
, . . .,a
n
. Hy xc nh s ln nht c th to
ra khi ghp cc s cho thnh mt s mi.
D liu vo t file vn bn NUMJOIN.INP c dng:
- Dng th nht cha s nguyn n,
- Dng th 2 cha n s nguyn a
1
a
2
. . . a
n
.
Kt qu ra file vn bn NUMJOIN.OUT gm mt dng l s ln nht c th
to ra khi ghp cc s cho thnh mt s mi.

55
3.16. GI TR NH NHT
Cho bng s A gm MxN , mi cha mt s nguyn khng m (A
ij
) c
gi tr khng vt qu 10
9
. Xt hng i v hng j ca bng, ta cn xc nh
X
ij
nguyn :
ij ij ij
1 1
| | | |
N N
ik jk
k k
S A X A X
= =

= +



t gi tr nh nht.
Tnh


D liu vo trong file WMT.INP c dng:
- Dng u l 2 s nguyn dng M, N (1<M, N<1001)
- M dng sau, mi dng N s
Kt qu ra file WMT.OUT c dng: gm mt s W
WMT.INP WMT.OUT
2 3
2 3 1
2 3 4
5
3.17. DECIPHERING THE MAYAN WRITING (IOI 2006)
Cng vic gii m ch vit ca ngi MAIA l kh khn hn ngi ta
tng nhiu. Tri qua hn 200 nm m ngi ta vn hiu rt t v cc ch
vit ny. Ch trong 3 thp nin gn y do cng ngh pht trin vic gii m
ny mi c nhiu tin b.
Ch vit Maia da trn cc k hiu nh gi l nt v, mi nt v tng ng
vi mt m ging ni. Mi t trong ch vit Maia s bao gm mt tp hp
cc nt v nh vy kt hp li vi nhiu kiu dng khc nhau. Mi nt v c
th hiu l mt k t ta hiu ngy nay.
Mt trong nhng vn ln khi gii m ch Maia l th t c cc nt v.
Do ngi Maia trnh by cc nt v ny khng theo th t pht m, m theo
cch th hin ca chng. Do vy nhiu khi bit ht cc nt v ca mt t
ri nhng vn khng th tm ra c chnh xc cch ghi v c ca t ny.
Cc nh kho c ang i tm kim mt t c bit W. H bit r tt c
cc nt v ca t ny nhng vn cha bit cc cch vit ra ca t ny. V h
bit c cc th sinh IOI'06 s n nn mun s tr gip ca cc sinh vin
ny. H s a ra ton b g nt v ca t W v dy S tt c cc nt v c

56
trong hang c. Bn hy gip cc nh kho c tnh xem c bao nhiu kh
nng xut hin t W trong hang .
Yu cu: Hy vit chng trnh, cho trc cc k t ca t W v dy S cc
nt v trong hang , tnh tng s kh nng xut hin ca t W trong dy S,
ngha l s ln xut hin mt hon v cc k t ca dy g k t trong S.
Cc rng buc
1 g 3 000, s nt v trong W
g |S| 3 000 000, |S| l s cc nt v ca dy S
D liu vo:
- Dng 1: cha 2 s g v |S| cch nhau bi du cch.
- Dng 2: cha g k t lin nhau l cc nt v ca t W. Cc k t hp l l
'a'-'z' v 'A'-'Z'. Cc ch in hoa v in thng l khc nhau.
- Dng 3: Cha |S| k t l dy cc nt v tm thy trong hang. Cc k t hp
l l 'a'-'z' v 'A'-'Z'. Cc ch in hoa v in thng l khc nhau.
Kt qu ra:
Cha ng 1 s l kh nng xut hin ca t W trong dy S.
D liu vo Kt qu ra
4 11
cAda
AbrAcadAbRa
2
3.18. TR CHI VI DY S (Hc sinh gii quc gia, 2007-2008)
Hai bn hc sinh trong lc nhn ri ngh ra tr chi sau y. Mi bn chn
trc mt dy s gm n s nguyn. Gi s dy s m bn th nht chn l:

, . . . ,


cn dy s m bn th hai chn l:

, . . . ,


Mi lt chi mi bn a ra mt s hng trong dy s ca mnh. Nu bn
th nht a ra s hng

1 , cn bn th hai a ra s hng

1 th gi ca lt chi s l |

|.
V d: Gi s dy s bn th nht chn l 1, -2; cn dy s m bn th hai
chn l 2, 3. Khi cc kh nng c th ca mt lt chi l (1, 2), (1, 3), (-
2, 2), (-2, 3). Nh vy, gi nh nht ca mt lt chi trong s cc lt chi
c th l 0 tng ng vi gi ca lt chi (-2, 2).

57
Yu cu: Hy xc nh gi nh nht ca mt lt chi trong s cc lt chi
c th.
D liu vo:
Dng u tin cha s nguyn dng 10


Dng th hai cha dy s nguyn

, . . . ,

| 10

,
1, 2, . . . ,
Dng th hai cha dy s nguyn

, . . . ,

| 10

, 1, 2, . . . ,
Hai s lin tip trn mt dng c ghi cch nhau bi du cch.
Kt qu ra:
Ghi ra gi nh nht tm c.
D liu vo Kt qu ra
2
1 -2
2 3
0
3.19. DY S (Hc sinh gii, H Ni 2008-2009)
Cho dy s nguyn

, . .

. S

1 c gi l mt s
trung bnh cng trong dy nu tn ti 3 ch s , , 1 , ,
i mt khc nhau, sao cho

/3
Yu cu: Cho v dy s

, . .

. Hy tm s lng cc s trung bnh


cng trong dy.
D liu vo:
- Dng u ghi s nguyn dng 3 1000
- Dng th hai cha s nguyn

| 10


Kt qu ra:
S lng cc s trung bnh cng trong dy.
D liu vo Kt qu ra
5
4 3 6 3 5
2

58
3.20. M S TAM GIC (Tin hc tr, bng B, nm 2009)
Cho ba s nguyn dng , , v , 10000 on thng nh s
t 1 ti . on thng th c di

(: 1 ), y cc di

, ,

c cho nh sau:


, nu 1

mod 1, nu 1

(*)
Hy cho bit c bao nhiu tam gic khc nhau c th c to ra bng cch
ly ng ba on trong s on thng cho lm ba cnh (hai tam gic
bng nhau nu chng c ba cp cnh tng ng bng nhau, nu khng
chng c coi l khc nhau).
V d vi 6; 3; 4; 5. Ta c 5 on thng vi di ca
chng tnh theo cng thc (*) l 3,2,4,4,4. Vi 5 on thng ny c th
to ra c 4 tam gic vi di cc cnh c ch ra nh sau:
Tam gic 1: (2, 3, 4)
Tam gic 2: (2, 4, 4)
Tam gic 3: (3, 4, 4)
Tam gic 4: (4, 4, 4)

59
Chuyn 4
THIT K GII THUT
Chuyn ny trnh by cc chin lc thit k thut gii nh: Quay lui
(Backtracking), Nhnh v cn (Branch and Bound), Tham n (Greedy Method),
Chia tr (Divide and Conquer) v Quy hoch ng (Dynamic Programming).
y l cc chin lc tng qut, nhng mi phng php ch p dng c cho
mt s lp bi ton nht nh, ch khng tn ti mt phng php vn nng
thit k thut ton gii quyt mi bi ton. Cc phng php thit k thut ton
trn ch l chin lc, c tnh nh hng tm thut ton. Vic p dng chin lc
tm ra thut ton cho mt bi ton c th cn i hi nhiu sng to. Trong
chuyn ny, ngoi phn trnh by v cc phng php, chuyn cn c
nhng v d c th, cng vi thut gii v ci t, c ci nhn chi tit t vic
thit k gii thut n xy dng chng trnh.
1. Quay lui (Backtracking)
Quay lui, vt cn, th sai, duyt l mt s tn gi tuy khng ng ngha nhng
cng ch mt phng php trong tin hc: tm nghim ca mt bi ton bng cch
xem xt tt c cc phng n c th. i vi con ngi phng php ny thng
l khng kh thi v s phng n cn kim tra ln. Tuy nhin i vi my tnh,
nh tc x l nhanh, my tnh c th gii rt nhiu bi ton bng phng php
quay, lui vt cn.
u im ca phng php quay lui, vt cn l lun m bo tm ra nghim ng,
chnh xc. Tuy nhin, hn ch ca phng php ny l thi gian thc thi lu,
phc tp ln. Do vt cn thng ch ph hp vi cc bi ton c kch thc
nh.
1.1. Phng php
Trong nhiu bi ton, vic tm nghim c th quy v vic tm vector hu hn

, ,

, , di vector c th xc nh trc hoc khng. Vector ny cn


phi tho mn mt s iu kin ty thuc vo yu cu ca bi ton. Cc thnh
phn

c chn ra t tp hu hn

.

60
Tu tng trng hp m bi ton c th yu cu: tm mt nghim, tm tt c
nghim hoc m s nghim.
V d: Bi ton 8 qun hu.
Cn t 8 qun hu vo bn c vua 8 8, sao cho
chng khng tn cng nhau, tc l khng c hai
qun hu no cng hng, cng ct hoc cng ng
cho.
V d: hnh bn l mt cch t hu tho mn yu
cu bi ton, cc c t mu l v tr t hu.
Do cc qun hu phi nm trn cc hng khc nhau, ta nh s cc qun hu t 1
n 8, qun hu i l qun hu nm trn hng th i (i=1,2,,8). Gi

l ct m
qun hu i ng. Nh vy nghim ca bi ton l vector

, ,

, trong
1

8, tc l

c chn t tp

1,2, ,8. Vector

, ,

l
nghim nu

v hai ,

, ,

khng nm trn cng mt ng cho.


V d: (1,5,8,6,3,7,2,4) l mt nghim.
T tng ca phng php quay lui vt cn nh sau: Ta xy dng vector nghim
dn tng bc, bt u t vector khng ( ). Thnh phn u tin

c chn ra
t tp

. Gi s chn c cc thnh phn

, ,

th t cc iu
kin ca bi ton ta xc nh c tp

(cc ng c vin c th chn lm thnh


phn

l tp con ca

). Chn mt phn t

ta m rng nghim c

, ,

. Lp li qu trnh trn tip tc m rng nghim. Nu khng th


chn c thnh phn

rng) th ta quay li chn mt phn t khc ca

cho

. Nu khng cn mt phn t no khc ca

ta quay li chn mt phn


t khc ca

lm

v c th tip tc. Trong qu trnh m rng nghim, ta


phi kim tra nghim ang xy dng l nghim ca bi ton cha. Nu ch cn
tm mt nghim th khi gp nghim ta dng li. Cn nu cn tm tt c cc nghim
th qu trnh ch dng li khi tt c cc kh nng la chn ca cc thnh phn ca
vector nghim b vt cn.
Lc tng qut ca thut ton quay lui vt cn c th biu din bi th tc
sau:
procedure Backtrack;
begin
S
1
:=A
1
;
k:=1;
while k>0 do begin

61
while S
k
<> do begin
<chn x
k
S
i
>;
S
k
:=S
k
{x
k
};
if (x
1
, x
2
,,x
k
) l nghim then <a ra nghim>;
k:=k+1;
<Xc nh S
k
>;
end;
k:=k-1; // quay lui
end;
end;
Trn thc t, thut ton quay lui vt cn thng c dng bng m hnh quy
nh sau:
procedure Backtrack(i);// xy dng thnh phn th i
begin
<Xc nh S
i
>;
for x
i
S
i
do begin
<ghi nhn thnh phn th i>;
if (tm thy nghim) then <a ra nghim>
else Backtrack(i+1);
<loi thnh phn i>;
end;
end;
Khi p dng lc tng qut ca thut ton quay lui cho cc bi ton c th, c
ba vn quan trng cn lm:
- Tm cch biu din nghim ca bi ton di dng mt dy cc i
tng c chn dn tng bc

, ,

, .
- Xc nh tp

cc ng c vin c chn lm thnh phn th i ca


nghim. Chn cch thch hp biu din

.
- Tm cc iu kin mt vector chn l nghim ca bi ton.
1.2. Mt s v d p dng
1.2.1. T hp
Mt t hp chp k ca n l mt tp con k phn t ca tp n phn t.
Chng hn tp {1,2,3,4} c cc t hp chp 2 l:
{1,2}, {1,3, {1,4, {2,3}, {2,4}, {3,4}

62
V trong tp hp cc phn t khng phn bit th t nn tp {1,2} cng l tp
{2,1}, do , ta coi chng ch l mt t hp.
Bi ton: Hy xc nh tt c cc t hp chp k ca tp n phn t. n gin ta
ch xt bi ton tm cc t hp ca tp cc s nguyn t 1 n n. i vi mt tp
hu hn bt k, bng cch nh s th t ca cc phn t, ta cng a c v bi
ton i vi tp cc s nguyn t 1 n n.
Nghim ca bi ton tm cc t hp chp k ca n phn t phi tho mn cc iu
kin sau:
- L mt vector

, ,

ly gi tr trong tp 1,2,
- Rng buc:

vi mi gi tr i t 1 n 1 (v tp hp khng
phn bit th t phn t nn ta sp xp cc phn t theo th t tng
dn).
Ta c: 1

, do tp

(tp cc ng c vin c chn


lm thnh phn th i) l t

1 n . iu ny ng cho c
trng hp 1, ta thm vo

0.
Sau y l chng trnh hon chnh, chng trnh s dng m hnh quy sinh
tt c cc t hp chp ca .
program ToHop;
const MAX =20;
type vector =array[0..MAX]of longint;
var x :vector;
n,k :longint;
procedure GhiNghiem(x:vector);
var i :longint;
begin
for i:=1 to k do write(x[i],' ');
writeln;
end;
procedure ToHop(i:longint);
var j:longint;
begin
for j := x[i-1]+1 to n-k+i do begin
x[i] := j;
if i=k then GhiNghiem(x)
else ToHop(i+1);

63
end;
end;
BEGIN
write('Nhap n, k:'); readln(n,k);
x[0]:=0;
ToHop(1);
END.
V d v Input / Output ca chng trnh:
n = 4, k=2

1. 1 2
2. 1 3
3. 1 4
4. 2 3
5. 2 4
6. 3 4
Theo cng thc, s lng t hp chp k=2 ca n=4 l:

1 1
!

!
! !

6
1.2.2. Chnh hp lp
Chnh hp lp chp k ca n l mt dy k thnh phn, mi thnh phn l mt phn
t ca tp n phn t, c xt n th t v khng yu cu cc thnh phn khc
nhau.
Mt v d d thy nht ca chnh hp lp l cc dy nh phn. Mt dy nh phn
di m l mt chnh hp lp chp m ca tp 2 phn t {0,1}. Cc dy nh phn
di 3:
000, 001, 010, 011, 100, 101, 110, 111.
V c xt th t nn dy 101 v dy 011 l 2 dy khc nhau.
Nh vy, bi ton xc nh tt c cc chnh hp lp chp k ca tp n phn t yu
cu tm cc nghim nh sau:
- L mt vector

, ,

ly gi tr trong tp 1,2,
- Khng c rng buc no gia cc thnh phn.

64
Ch l cng nh bi ton tm t hp, ta ch xt i vi tp n s nguyn t 1 n
n. Nu phi tm chnh hp khng phi l tp cc s nguyn t 1 n n th ta c th
nh s cc phn t ca tp a v tp cc s nguyn t 1 n n.
{s dng mt mng x[1..n] biu din chnh hp lp.
Th tc quy sau sinh tt c chnh hp lp chp k ca n}
procedure ChinhHopLap(i:longint);
var j:longint;
begin
for j := 1 to n do begin
x[i] := j;
if i=k then GhiNghiem(x)
else ChinhHopLap(i+1);
end;
end;
V d v Input/Output ca chng trnh:
n = 2, k=3 1. 1 1 1
2. 1 1 2
3. 1 2 1
4. 1 2 2
5. 2 1 1
6. 2 1 2
7. 2 2 1
8. 2 2 2
Theo cng thc, s lng chnh hp lp chp k=3 ca n=2 l:

8
1.2.3. Chnh hp khng lp
Khc vi chnh hp lp l cc thnh phn c php lp li (tc l c th ging
nhau), chnh hp khng lp chp k ca tp n (kn) phn t cng l mt dy k
thnh phn ly t tp n phn t c xt th t nhng cc thnh phn khng c
php ging nhau.
V d: C n ngi, mt cch chn ra k ngi xp thnh mt hng l mt chnh
hp khng lp chp k ca n.
Mt trng hp c bit ca chnh hp khng lp l hon v. Hon v ca mt tp
n phn t l mt chnh hp khng lp chp n ca n. Ni mt cch trc quan th

65
hon v ca tp n phn t l php thay i v tr ca cc phn t (do mi gi l
hon v).
Nghim ca bi ton tm cc chnh hp khng lp chp k ca tp n s nguyn t 1
n n l cc vector tho mn cc iu kin:
- c k thnh phn:

, ,

ly gi tr trong tp 1,2,
- Rng buc: cc gi tr

i mt khc nhau, tc l

vi mi .
Sau y l chng trnh hon chnh, chng trnh s dng m hnh quy sinh
tt c cc chnh hp khng lp chp ca phn t.
program ChinhHopKhongLap;
const MAX =20;
type vector =array[0..MAX]of longint;
var x :vector;
d :array[1..MAX]of longint; { mng d kim
sot rng buc cc gi tr

i mt khc nhau,

vi mi }
n,k :longint;
procedure GhiNghiem(x:vector);
var i :longint;
begin
for i:=1 to k do write(x[i],' ');
writeln;
end;
procedure ChinhHopKhongLap(i:longint);
var j:longint;
begin
for j := 1 to n do
if d[j]=0 then begin
x[i] := j;
d[j] := 1;
if i=k then GhiNghiem(x)
else ChinhHopKhongLap(i+1);
d[j] := 0;
end;
end;
BEGIN
write('Nhap n, k(k<=n):'); readln(n,k);

66
fillchar(d,sizeof(d),0);
ChinhHopKhongLap(1);
END.
V d v Input / Output ca chng trnh:
n = 3, k=3 1. 1 2 3
2. 1 3 2
3. 2 1 3
4. 2 3 1
5. 3 1 2
6. 3 2 1
Theo cng thc, s lng chnh hp khng lp chp k=3 ca n=3 l:

1 1
!
!
6
1.2.4. Bi ton xp 8 qun hu
Trong bi ton 8 qun hu, nghim ca bi ton c th biu din di dng vector

, ,

tho mn:
1)

l ta ct ca qun hu ang ng dng th ,

1,2, ,8.
2) Cc qun hu khng ng cng ct tc l

vi .
3) C th d dng nhn ra rng hai (x
1
,y
1
) v
(x
2
,y
2
) nm trn cng ng cho chnh (trn xung
di) nu: x
1
y
1
=x
2
y
2
, hai (x
1
,y
1
) v (x
2
,y
2
) nm
trn cng ng cho ph (t di ln trn) nu:
x
1
+y
1
=x
2
+y
2
, nn iu kin hai qun hu xp
hai ,

, ,

khng nm trn cng mt ng


cho l:


Do , khi chn c

, ,

th

c chn phi tho mn cc


iu kin:

vi mi 1

67
Sau y l chng trnh y , lit k tt c cc cch xp 8 qun hu ln bn
c vua 88.
program XepHau;
type vector =array[1..8]of longint;
var x :vector;
procedure GhiNghiem(x:vector);
var i :longint;
begin
for i:=1 to 8 do write(x[i],' ');
writeln;
end;
procedure XepHau(k:longint);
var Sk :array[1..8]of longint;
xk,i,nSk :longint;
ok :boolean;
begin
{Xc nh tp S
k
l tp cc ng c vin c th chn lm thnh phn x
k
}
nSk:=0;{lc lng ca tp S
k
}
for xk:=1 to 8 do {th ln lt tng gi tr 1, 2, ,8}
begin
ok:=true;
{kim tra gi tr c th chn lm ng c vin cho x
k
c hay khng}
for i:=1 to k-1 do
if not((xk<>x[i])and(k-xk<>i-x[i])
and(k+xk<>i+x[i])) then
begin
ok:=false;
break;
end;
if ok then begin {c th chn lm ng c vin cho x
k
,kt np
vo tp S
k
}
inc(nSk);
Sk[nSk]:=xk;
end;
end;
{chn gi tr x
k
t tp S
k
}
for i:=1 to nSk do begin
x[k]:=Sk[i];

68
if k=8 then GhiNghiem(x)
else XepHau(k+1);
x[k]:=0;
end;
end;
BEGIN
XepHau(1);
END.
Vic xc nh tp S
k
c th thc hin n gin v hiu qu hn bng cch s dng
cc mng nh du. C th, khi ta t hu i (i,x[i]), ta s nh du ct x[i]
(dng mt mng nh du nh bi ton chnh hp khng lp), nh du ng
cho chnh (i-x[i]) v nh du ng cho ph (i+x[i]).
const n =8;
type vector =array[1..n]of longint;
var cot :array[1..n]of longint;
cheoChinh :array[1-n..n-1]of longint;
cheoPhu :array[1+1..n+n]of longint;
x :vector;
procedure GhiNghiem(x:vector);
var i :longint;
begin
for i:=1 to n do write(x[i],' ');
writeln;
end;
procedure xepHau(k:longint);
var i :longint;
begin
for i:=1 to n do
if (cot[i]=0) and (cheoChinh[k-i]=0) and
(cheoPhu[k+i]=0) then
begin
x[k]:=i;
cot[i]:=1;
cheoChinh[k-i]:=1;
CheoPhu[k+i]:=1;
if k=n then GhiNghiem(x)
else xepHau(k+1);
cot[i]:=0;

69
cheoChinh[k-i]:=0;
CheoPhu[k+i]:=0;
end;
end;
BEGIN
fillchar(cot,sizeof(cot),0);
fillchar(cheoChinh,sizeof(cheoChinh),0);
fillchar(cheoPhu,sizeof(cheoPhu),0);
xepHau(1);
END.
Bi ton xp hu c tt c 92 nghim, mi nghim u tin m chng trnh tm
c l:
1. 1 5 8 6 3 7 2 4
2. 1 6 8 3 7 4 2 5
3. 1 7 4 6 8 2 5 3
4. 1 7 5 8 2 4 6 3
5. 2 4 6 8 3 1 7 5
6. 2 5 7 1 3 8 6 4
7. 2 5 7 4 1 8 6 3
8. 2 6 1 7 4 8 3 5
9. 2 6 8 3 1 4 7 5
10. 2 7 3 6 8 5 1 4
1.2.5. Bi ton my rt tin t ng ATM
Mt my ATM hin c 20 t tin c gi

, ,

. Hy a ra mt
cch tr vi s tin ng bng .
D liu vo t file ATM.INP c dng:
- Dng u l 2 s v
- Dng th 2 gm s

, ,


Kt qu ra file ATM.OUT c dng: Nu c th tr ng th a ra cch tr,
nu khng ghi -1.
ATM.INP ATM.OUT
10 390
200 10 20 20 50 50 50 50 100 100
20 20 50 50 50 100 100
Nghim ca bi ton l mt dy nh phn di , trong thnh phn th i bng
1 nu t tin th i c s dng tr, bng 0 trong trng hp ngc li.

70

, ,

l nghim nu:


Trong chng trnh di y c s dng mt bin ok kim sot vic tm
nghim. Ban u cha c nghim, do khi tr ok=FALSE. Khi tm c
nghim, ok s c nhn gi tr bng TRUE. Nu ok=TRUE ( tm thy nghim)
ta s khng cn tm kim na.
const MAX =20;
fi ='ATM.INP';
fo ='ATM.OUT';
type vector =array[1..MAX]of longint;
var t :array[1..MAX]of longint;
x,xs :vector;
n,s,sum :longint;
ok :boolean;
procedure input;
var f :text;
i :longint;
begin
assign(f,fi); reset(f);
readln(f,n, s);
for i:=1 to n do read(f,t[i]);
close(f);
end;
procedure check(x:vector);
var i :longint;
f :text;
begin
if sum = s then begin
xs:=x;
ok:=true;
end;
end;
procedure printResult;
var i :longint;
f :text;
begin
assign(f,fo); rewrite(f);
if ok then begin
for i:=1 to n do

71
if xs[i]=1 then write(f,t[i],' ');
end
else write(f,'-1');
close(f);
end;
procedure backTrack(i:longint);
var j :longint;
begin
for j:=0 to 1 do begin
x[i]:=j;
sum:=sum + x[i]*t[i];
if (i=n) then check(x)
else if sum<=s then backTrack(i+1);
if ok then exit; {nu tm c nghim th khng duyt na}
sum:=sum - x[i]*t[i];
end;
end;
BEGIN
input;
ok:=false;
sum:=0;
backTrack(1);
PrintResult;
END.
2. Nhnh v cn
2.1. Phng php
Trong thc t, c nhiu bi ton yu cu tm ra mt phng n tho mn mt s
iu kin no , v phng n l tt nht theo mt tiu ch c th. Cc bi
ton nh vy c gi l bi ton ti u. C nhiu bi ton ti u khng c thut
ton no thc s hu hiu gii quyt, m cho n nay vn phi da trn m
hnh xem xt ton b cc phng n, ri nh gi chn ra phng n tt nht.
Phng php nhnh v cn l mt dng ci tin ca phng php quay lui, c
p dng tm nghim ca bi ton ti u.
Gi s nghim ca bi ton c th biu din di dng mt vector

, ,

,
mi thnh phn

1,2, . . , c chn ra t tp

. Mi nghim ca bi ton

72

, ,

, c xc nh tt bng mt hm v mc tiu cn
tm nghim c gi tr t gi tr nh nht (hoc t gi tr ln nht).
T tng ca phng php nhnh v cn nh sau: Gi s, xy dng c k
thnh phn

, ,

ca nghim v khi m rng nghim

, ,

,
nu bit rng tt c cc nghim m rng ca n

, ,

, u khng tt
bng nghim tt nht bit thi im , th ta khng cn m rng t

, ,

na. Nh vy, vi phng php nhnh v cn, ta khng phi duyt


ton b cc phng n tm ra nghim tt nht m bng cch nh gi cc
nghim m rng, ta c th ct b i nhng phng n (nhnh) khng cn thit, do
vic tm nghim ti u s nhanh hn. Ci kh nht trong vic p dng phng
php nhnh v cn l nh gi c cc nghim m rng, nu nh gi c tt
s gip b qua c nhiu phng n khng cn thit, khi thut ton nhnh cn
s chy nhanh hn nhiu so vi thut ton vt cn.
Thut ton nhnh cn c th m t bng m hnh quy sau:
procedure BranchBound(i);// xy dng thnh phn th i
begin
<nh gi cc nghim m rng>;
if(cc nghim m rng u khng tt hn
BestSolution)then exit;
<Xc nh S
i
>;
for x
i
S
i
do begin
<ghi nhn thnh phn th i>;
if (tm thy nghim) then <Cp nht BestSolution>
else BranchBound(i+1);
<loi thnh phn i>;
end;
end;
Trong th tc trn, BestSolution l nghim tt nht bit thi im . Th
tc <cp nht BestSolution> s xc nh tt ca nghim mi tm thy,
nu nghim mi tm thy tt hn BestSolution th BestSolution s c
cp nht li l nghim mi tm c.

73
2.2. Gii bi ton ngi du lch bng phng php nhnh cn.
Bi ton. Cho n thnh ph nh s t 1 n n v cc tuyn ng giao thng hai
chiu gia chng, mng li giao thng ny c cho bi mng C[1..n,1..n],
y C
ij
= C
ji
l chi ph i on ng trc tip t thnh ph i n thnh ph j.
Mt ngi du lch xut pht t thnh ph 1, mun i thm tt c cc thnh ph
cn li mi thnh ph ng 1 ln v cui cng quay li thnh ph 1. Hy ch ra
cho ngi hnh trnh vi chi ph t nht. Bi ton c gi l bi ton ngi du
lch hay bi ton ngi cho hng (Travelling Salesman Problem - TSP)
D liu vo trong file TSP.INP c dng:
- Dng u cha s n(1<n20), l s thnh ph.
- n dng tip theo, mi dng n s m t mng C
Kt qu ra file TSP.OUT c dng:
- Dng u l chi ph t nht
- Dng th hai m t hnh trnh
V d 1:
TSP.INP TSP.OUT Hnh minh ha
4
0 20 35 42
20 0 34 30
35 34 0 12
42 30 12 0

97
1->2->4->3->1

V d 2:
TSP.INP TSP.OUT Hnh minh ha
4
0 20 35 10
20 0 90 50
35 90 0 12
10 50 12 0
117
1->2->4->3->1


74
Gii
1) Hnh trnh cn tm c dng (x
1
= 1, x
2
, ..., x
n
, x
n+1
= 1), y gia x
i
v
x
i+1
: hai thnh ph lin tip trong hnh trnh phi c ng i trc tip;
tr thnh ph 1, khng thnh ph no c lp li hai ln, c ngha l
dy (x
1
, x
2
, ..., x
n
) lp thnh mt hon v ca (1, 2, ..., n).
2) Duyt quay lui: x
2
c th chn mt trong cc thnh ph m x
1
c ng
i trc tip ti, vi mi cch th chn x
2
nh vy th x
3
c th chn mt
trong cc thnh ph m x
2
c ng i ti (ngoi x
1
). Tng qut: x
i
c
th chn 1 trong cc thnh ph cha i qua m t x
i-1
c ng i trc
tip ti.(2 i n).
3) Nhnh cn: Khi to cu hnh BestSolution c chi ph = +. Vi mi
bc th chn x
i
xem chi ph ng i cho ti lc c nh hn chi ph
ca cu hnh BestSolution khng? nu khng nh hn th th gi tr
khc ngay bi c i tip cng ch tn thm. Khi th c mt gi tr x
n

ta kim tra xem x
n
c ng i trc tip v 1 khng ? Nu c nh gi
chi ph i t thnh ph 1 n thnh ph x
n
cng vi chi ph t x
n
i trc
tip v 1, nu nh hn chi ph ca ng i BestSolution th cp nht li
BestSolution bng cch i mi.
program TSP;
const MAX =20;
oo =1000000;
fi ='TSP.INP';
fo ='TSP.OUT';
var c :array[1..MAX,1..MAX]of longint;
x,bestSolution :array[1..MAX]of longint;
d :array[1..MAX]of longint;
n :longint;
sum,best :longint;
procedure input;
var f :text;
i,j,k :longint;
begin
assign(f,fi); reset(f);
read(f,n);
for i:=1 to n do
for j:=1 to n do read(f,C[i,j]);
close(f);

75
end;
procedure update;
begin
if sum+C[x[n],x[1]]<best then begin
best:=sum+C[x[n],x[1]];
bestSolution:=x;
end;
end;
procedure branchBound(i:longint);
var j :longint;
begin
if sum>=best then exit;
for j:=1 to n do
if d[j]=0 then begin
x[i]:=j;
d[j]:=1;
sum:=sum + C[x[i-1],j];
if i=n then update
else branchBound(i+1);
sum:=sum - C[x[i-1],j];
d[j]:=0;
end;
end;
procedure init;
begin
fillchar(d,sizeof(d),0);
d[1]:=1;
x[1]:=1;
best:=oo;
end;
procedure output;
var f :text;
i :longint;
begin
assign(f,fo); rewrite(f);
writeln(f,best);
for i:=1 to n do write(f,bestSolution[i],'->');
write(f,bestSolution[1]);
close(f);

76
end;
BEGIN
input;
init;
branchBound(2);
output;
END.
Chng trnh trn l mt gii php nhnh cn rt th s gii bi ton TSP, c th
c nhiu cch nh gi nhnh cn cht hn na lm tng hiu qu ca chng
trnh.
2.3. Bi ton my rt tin t ng ATM
Bi ton
Mt my ATM hin c 20 t tin c gi

, ,

. Hy tm cch tr t
t nht vi s tin ng bng .
D liu vo t file ATM.INP c dng:
- Dng u l 2 s v
- Dng th 2 gm s

, ,


Kt qu ra file ATM.OUT c dng: Nu c th tr tin ng bng th a ra
s t t nht cn tr v a ra cch tr, nu khng ghi -1.
ATM.INP ATM.OUT
10 390
200 10 20 20 50 50 50 50 100 100
5
20 20 50 100 200
Gii
Nh ta bit, nghim ca bi ton l mt dy nh phn di , gi s xy
dng c thnh phn

, ,

, tr c v s dng t.
nh gi c cc nghim m rng ca

, ,

, ta nhn thy:
- Cn phi tr
- Gi l gi cao nht trong cc t tin cn li (

, . . ,

th t nht cn s dng thm

t na.
Do , nu

m ln hn hoc bng s t ca cch tr tt nht hin c


th khng cn m rng cc nghim ca

, ,

na.

77
const MAX =20;
fi ='ATM.INP';
fo ='ATM.OUT';
type vector =array[1..MAX]of longint;
var t,tmax :array[1..MAX]of longint;
x,xbest :vector;
c,cbest :longint;
n,s,sum :longint;
procedure input;
var f :text;
i :longint;
begin
assign(f,fi); reset(f);
readln(f,n, s);
for i:=1 to n do read(f,t[i]);
close(f);
end;
procedure init;
var i :longint;
begin
tmax[n]:=t[n];
for i:=n-1 downto 1 do begin
tmax[i]:=tmax[i+1];
if tmax[i]<t[i] then tmax[i]:=t[i];
end;
sum:=0;
c:=0;
cbest:=n+1;
end;
procedure update;
var i :longint;
f :text;
begin
if (sum = s) and (c<cbest) then begin
xbest:=x;
cbest:=c;
end;
end;
procedure printResult;

78
var i :longint;
f :text;
begin
assign(f,fo); rewrite(f);
if cbest<n+1 then begin
writeln(f,cbest);
for i:=1 to n do
if xbest[i]=1 then write(f,t[i],' ');
end
else write(f,'-1');
close(f);
end;
procedure branchBound(i:longint);
var j :longint;
begin
if c + (s-sum)/tmax[i] >= cbest then exit;
for j:=0 to 1 do begin
x[i]:=j;
sum:=sum + x[i]*t[i];
c:=c + j;
if (i=n) then update
else if sum<=s then branchBound(i+1);
sum:=sum - x[i]*t[i];
c:=c - j;
end;
end;
BEGIN
input;
init;
branchBound(1);
PrintResult;
END.
3. Tham n (Greedy Method)
Phng php nhnh cn l ci tin phng php quy lui, nh gi c cc
nghim m rng loi b i nhng phng n khng cn thit, gip cho vic tm
nghim ti u nhanh hn. Tuy nhin, khng phi lc no chng ta cng c th
nh gi c nghim m rng, hoc nu c nh gi c th s phng n cn

79
xt vn rt ln, khng th p ng c trong thi gian cho php. Khi , ngi
ta chp nhn tm nhng nghim gn ng so vi nghim ti u. Phng php
tham n c s dng trong cc trng hp nh vy. u im ni bt ca phng
php tham n l phc tp nh, thng nhanh chng tm c li gii.
3.1. Phng php
Gi s nghim ca bi ton c th biu din di dng mt vector

, ,

,
mi thnh phn

1,2, . . , c chn ra t tp

. Mi nghim ca bi ton

, ,

, c xc nh tt bng mt hm v mc tiu cn
tm nghim c gi tr cng ln cng tt (hoc cng nh cng tt).
T tng ca phng php tham n nh sau: Ta xy dng vector nghim X dn
tng bc, bt u t vector khng ( ). Gi s xy dng c (k-1) thnh phn

, ,

ca nghim v khi m rng nghim ta s chn

tt nht
trong cc ng c vin trong tp

, ,

. Vic la chn nh th
c thc hin bi mt hm chn. C tip tc xy dng, cho n khi xy dng
xong ht thnh phn ca nghim.
Lc tng qut ca phng php tham n.
procedure Greedy;
begin
X:=;
i:=0;
while (cha xy dng xong ht thnh phn ca nghim) do
begin
i:=i+1;
<Xc nh S
i
>;
xselect(S
i
);// chn ng c vin tt nht trong tp S
i

end;
end;
Trong lc tng qut trn, Select l hm chn, chn ra t tp cc ng c
vin S
i
mt ng c vin c xem l tt nht, nhiu ha hn nht.
Cn nhn mnh rng, thut ton tham n trong mt s bi ton, nu xy dng
c hm thch hp c th cho nghim ti u. Trong nhiu bi ton, thut ton
tham n ch tm c nghim gn ng vi nghim ti u.
3.2. Bi ton ngi du lch
(Bi ton mc 2.2)

80
C nhiu thut ton tham n cho bi ny, mt thut ton vi tng n gin nh
sau: Xut pht t thnh ph 1, ti mi bc ta s chn thnh ph tip theo l thnh
ph cha n thm m chi ph t thnh ph hin ti n thnh ph l nh nht,
c th:
+ Hnh trnh cn tm c dng (x
1
= 1, x
2
, ..., x
n
, x
n+1
= 1), trong dy (x
1
,
x
2
, ..., x
n
) lp thnh mt hon v ca (1, 2, ..., n).
+ Ta xy dng nghim tng bc, bt u t x
1
=1, chn x
2
l thnh ph gn
x
1
nht, sau chn x
3
l thnh ph gn x
2
nht (x
3
khc x
1
)... Tng qut:
chn x
i
l thnh ph cha i qua m gn x
i-1
nht.(2 i n).
program TSP;
const MAX =100;
oo =1000000;
fi ='TSP.INP';
fo ='TSP.OUT';
var c :array[1..MAX,1..MAX]of
longint;
x :array[1..MAX]of longint;
d :array[1..MAX]of longint;
n :longint;
sum :longint;
procedure input;
var f :text;
i,j,k :longint;
begin
assign(f,fi); reset(f);
read(f,n);
for i:=1 to n do
for j:=1 to n do read(f,C[i,j]);
close(f);
end;
procedure output;
var f :text;
i :longint;
begin
assign(f,fo); rewrite(f);
writeln(f,sum);
for i:=1 to n do write(f,x[i],'->');
write(f,x[1]);

81
close(f);
end;
procedure Greedy;
var i,j,xi :longint;
best :longint;
begin
x[1]:=1;
d[1]:=1;
i:=1;
while i<n do begin
inc(i);
// chn ng c vin tt nht
best:=oo;
for j:=1 to n do
if (d[j]=0) and (c[x[i-1],j]<best) then begin
best:=c[x[i-1],j];
xi:=j;
end;
x[i]:=xi; //ghi nhn thnh phn nghim th i
d[xi]:=1;
sum:=sum+c[x[i-1],x[i]];
end;
sum:=sum+c[x[n],x[1]];
end;
BEGIN
input;
Greedy;
output;
END.
V d 1. Xut pht t thnh ph 1, ta xy dng c hnh trnh 1 2 4 31
vi chi ph 97, y l phng n ti u.


82
V d 2. Xut pht t thnh ph 1, ta xy dng c hnh trnh 1 4 3 21
vi chi ph 132, nhng kt qu ti u l 117.

3.3. Bi ton my rt tin t ng ATM
(bi ton mc 2.3)
Thut ton vi tng tham n n gin, hm chn nh sau: Ti mi bc ta s
chn t tin ln nht cn li khng vt qu lng tin cn phi tr, c th:
- Sp xp cc t tin gim dn theo gi tr.
- Ln lt xt cc t tin t gi tr ln n gi tr nh, nu vn cn cha ly
v t tin ang xt c gi tr nh hn hoc bng th ly lun t tin
.
const MAX =100;
fi ='ATM.INP';
fo ='ATM.OUT';
type vector =array[1..MAX]of longint;
var t :array[1..MAX]of longint;
x :vector;
c :longint;
n,s :longint;
procedure input;
var f :text;
i :longint;
begin
assign(f,fi); reset(f);
readln(f,n, s);
for i:=1 to n do read(f,t[i]);
close(f);
end;
procedure greedy;
var i,j :longint;

83
tmp :longint;
begin
fillchar(x,sizeof(x),0);
{sp xp cc t theo gi tr gim dn}
for i:=1 to n-1 do
for j:=i+1 to n do
if t[i]<t[j] then begin
tmp:=t[i];
t[i]:=t[j];
t[j]:=tmp;
end;
c:=0;
for i:=1 to n do
if s>=t[i] then
begin
inc(c); {s lng t ly}
x[i]:=1; {t i c ly}
s:=s-t[i];
end;
end;
procedure printResult;
var i :longint;
f :text;
begin
assign(f,fo); rewrite(f);
if s=0 then begin
writeln(f,c);
for i:=1 to n do
if x[i]=1 then write(f,t[i],' ');
end
else write(f,'-1'); {nu khng ly c S, S>0}
close(f);
end;
BEGIN
input;
greedy;
PrintResult;
END.

84
Cc b test th nghim
test D liu vo Kt qu tm c
1 10 390
200 10 20 20 50 50 50 50 100 100
5
200 100 50 20 20
2 11 100
50 20 20 20 20 20 2 2 2 2 2
8
50 20 20 2 2 2 2 2
3 6 100
50 20 20 20 20 20
-1
Vi b test (1), thut ton tham n cng cho c nghim ti u.Tuy nhin, vi
b test (2), thut ton tham n khng cho nghim ti u v vi b test (3), thut
ton tham n khng tm nghim mc d c nghim.
3.4. Bi ton lp lch gim thiu tr hn
Bi ton:
C cng vic nh s t 1 n v c mt my thc hin, bit:
-

l thi gian cn thit hon thnh cng vic .


-

l thi hn hon thnh cng vic .


My bt u hot ng t thi im 0. Mi cng vic cn c thc hin lin tc
t lc bt u cho ti khi kt thc, khng c php ngt qung. Gi s

l thi
im hon thnh cng vic . Khi , nu

>

ta ni cng vic b hon thnh


tr hn, cn nu

th ta ni cng vic c hon thnh ng hn.


Yu cu: Tm trnh t thc hin cc cng vic sao cho s cng vic hon thnh tr
hn l t nht (hay s cng vic hon thnh ng hn l nhiu nht).
D liu vo trong file JS.INP c dng:
- Dng u l s 100 l s cng vic
- Dng th hai gm s l thi gian thc hin cc cng vic
- Dng th ba gm s l thi hn hon thnh cc cng vic
Kt qu file JS.OUT c dng: gm mt dng l trnh t thc hin cc cng
vic.
V d: gi s c 5 cng vic vi thi gian thc hin v thi gian hon thnh
nh sau:
1 2 3 4 5

6 3 5 7 2

85

8 4 15 20 3
Nu thc hin theo th t 1, 2, 3, 4, 5 th s c 3 cng vic b tr hn l cng vic
2, 4 v 5. Cn nu thc hin theo th t 5, 1, 3, 4, 2 th ch c 1 cng vic b tr
hn l cng vic 2, y l th t thc hin m s cng vic b tr hn t nht
(nghim ti u).
Gii
Ta c hai nhn xt sau:
+ Nu th t thc hin cc cng vic m c cng vic b tr hn c xp trc
mt cng vic ng hn th ta s nhn c trnh t tt hn bng cch chuyn
cng vic tr hn xung cui cng (v ng no cng vic ny cng b tr hn).
V d: th t 1, 2, 3, 4, 5 c cng vic 2 b tr hn xp trc cng vic 3 ng
hn, ta chuyn cng vic 2 xung cui cng nhn c th t: 1, 3, 4, 5, 2, th
t ny ch c 2 cng vic b qu hn l cng vic 5 v 2.
Nh vy, ta ch quan tm n vic xp lch cho cc cng vic hon thnh ng
hn, cn cc cng vic b tr hn c th thc hin theo trnh t bt k.
+ Gi s l tp gm cng vic (m c cng vic ny u c th thc hin
ng hn) v

, . . ,

l mt hon v ca cc cng vic trong sao cho

th th t l th t hon thnh ng hn c c
cng vic.
V d: gm 4 cng vic 1, 3, 4, 5 (4 cng vic ny u c th thc hin ng
hn), ta c th t thc hin 5, 1, 3, 4 v

15

20 c 4 cng vic u thc hin ng hn.


S dng chin lc tham n, ta xy dng tp cng vic theo tng bc, ban
u . Hm chn c xy dng nh sau: ti mi bc ta s chn cng vic

m c thi gian thc hin nh nht trong s cc cng vic cn li cho vo tp


. Nu sau khi kt np

, cc cng vic trong tp u c th thc hin ng


hn th c nh vic kt np

vo tp , nu khng th khng kt np

.
n gin, ta gi s rng cc cng vic c nh s theo th t thi gian thc
hin tng dn

. Ta c lc thut ton tham n nh sau:


procedure JobScheduling;
begin
;
for i:=1 to n do

86
if cc cng vic trong tp (

hon thnh ng
hn then
;
for i:=1 to n do
if

then

;
end;
Sau y l chng trnh hon chnh:
const MAX =100;
fi ='js.inp';
fo ='js.out';
type TJob =record
p, d :longint;
name :longint;
end;
TArrJobs =array[1..MAX]of TJob;
var jobs,Js :TArrJobs;
d :array[1..MAX]of longint;
n,m :longint;
procedure input;
var f :text;
i :longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do read(f,jobs[i].p);
for i:=1 to n do read(f,jobs[i].d);
close(f);
for i:=1 to n do jobs[i].name:=i;
end;
procedure swap(var j1,j2:TJob);
var tmp :TJob;
begin
tmp:=j1;
j1:=j2;
j2:=tmp;
end;
function check(var Js:TArrJobs; nJob:longint):boolean;

87
var i,j :longint;
t :longint;
begin
for i:=1 to nJob-1 do
for j:=i+1 to nJob do
if Js[i].d>Js[j].d then swap(Js[i],Js[j]);
t:=0;
for i:=1 to nJob do begin
if t+Js[i].p>Js[i].d then exit(false);
t:=t+Js[i].p;
end;
exit(true);
end;
procedure Greedy;
var i,j :longint;
Js2 :TArrJobs;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if jobs[i].p > jobs[j].p then
swap(jobs[i],jobs[j]);
fillchar(d,sizeof(d),0);
m:=0;
for i:=1 to n do begin
Js2:=Js;
Js2[m+1]:=jobs[i];
if check(Js2,m+1) then begin
m:=m+1;
Js:=Js2;
d[i]:=1;
end;
end;
//writeln(m);
for i:=1 to n do
if d[i]=0 then begin
m:=m+1;
Js[m]:=jobs[i];
end;
end;

88
procedure printResult;
var f :text;
i :longint;
begin
assign(f,fo); rewrite(f);
for i:=1 to n do write(f,Js[i].name,' ');
close(f);
end;
BEGIN
input;
Greedy;
printResult;
END.
Ch : Thut ton tham n trnh by trn lun cho phng n ti u.
4. Chia tr (Divide and Conquer)
4.1. Phng php
T tng ca chin lc chia tr nh sau: Ngi ta phn bi ton cn gii thnh
cc bi ton con. Cc bi ton con li c tip tc phn thnh cc bi ton con
nh hn, c th tip tc cho ti khi ta nhn c cc bi ton con hoc c thut
gii hoc l c th d rng a ra thut gii. Sau ta tm cch kt hp cc
nghim ca cc bi ton con nhn c nghim ca bi ton con ln hn,
cui cng nhn c nghim ca bi ton cn gii. Thng thng cc bi ton con
nhn c trong qu trnh phn chia l cng dng vi bi ton ban u, ch c c
ca chng l nh hn.
Thut ton chia tr c th biu din bng m hnh quy nh sau:
procedure DivideConquer(A,x); // tm nghim x ca bi ton A
begin
if (A nh) then Solve(A)
else begin
Phn A thnh cc bi ton con A
1
, A
2
, , A
m
;
for i:=1 to m do DivideConquer(A
i
, x
i
);
Kt hp cc nghim x
i
(i=1,2,..,m) ca cc bi ton
con A
i
nhn c nghim ca bi ton A;
end;
end;

89
Trong th tc trn, Solve(A) l thut gii bi ton A trong trng hp A c c
nh.
Trong thut ton tm kim nh phn v thut ton sp xp nhanh-QuickSort (
chuyn sp xp) l hai thut ton c thit k da trn chin lc chia tr.
Sau y, chng ta s tm hiu mt s v d minh ha cho phng php chia tr.
4.2. Bi ton tnh


Bi ton: Cho s v s nguyn dng , tnh


Cch 1: S dng thut ton lp, mt php nhn tnh


procedure power(a,n:longint;var p:longint);
{gi tr a
n
s c lu vo bin p}
var i : longint;
begin
p:=1;
for i:=1 to n do p:=p*a;
end;
var a, n, p : longint;
BEGIN
write('Nhap a, n:'); readln(a, n);
power(a,n,p);
write(p);
END.
Cch 2: p dng k thut chia tr, ta tnh

da vo

(trong 2)
nh sau:
- nu chn:


- nu n l:


tnh

ta li da vo

, qu trnh chia nh cho n khi nhn c bi
ton tnh

th dng.
V d: tnh 9
13

- bi ton c tnh da trn bi ton con 9

, ta c 9


- bi ton 9
6
c tnh da trn bi ton con 9
3
, ta c 9


- bi ton 9
3
c tnh da trn bi ton con 9
1
, ta c 9


Th tc quy power(a,n,p) sau th hin tng trn.
procedure power(a,n:longint; var p:longint);
var tmp : longint;

90
begin
if (n=1) then p:=a
else begin
power(a,n div 2,tmp);
if (n mod 2=1) then p:=tmp*tmp*a
else p:=tmp*tmp;
end;
end;
hoc vit di dng hm nh sau:
function power(a,n:longint):longint;
var tmp : longint;
begin
if (n=1) then exit(a)
else begin
tmp:=power(a,n div 2);
if (n mod 2=1) then exit(tmp*tmp*a)
else exit(tmp*tmp);
end;
end;
nh gi thi gian thc hin thut ton, ta tnh s php nhn phi s dng, gi
l s php nhn thc hin, ta c:

1 0

2
1 1 1

2
2

2 2 2
Nh vy, thut ton chia tr mt khng qu 2 php nhn, nh hn rt
nhiu so vi php nhn.
4.3. Bi ton
Bi ton: Cho mng s nguyn 1. . , cn tm 1. .
t gi tr ln nht m 1 .
V d: mng gm 6 s 4, 2, 5, 8, 1, 7 th lch cn tm l: 6
Cch 1: Th tt c cc cp ch s , , phc tp


procedure find(var maxDiff:longint);
var i,j :longint;

91
begin
maxDiff:=0;
for i:=1 to n do
for j:=i to n do
if a[j]-a[i]>maxDiff then maxDiff:=a[j]-a[i];
end;
Cch 2: p dng k thut chia tr, ta chia mng 1. . thnh hai mng con
1. . v 1. . trong 2, ta c:
1. .
1. .
1. .
1. . 1. .


Nu tm c lch , gi tr ln nht v gi tr nh nht
ca hai mng con 1. . v 1. . , ta s d rng xc nh c gi tr
1. . ). tm lch, gi tr ln nht v gi tr nh nht ca hai mng
con 1. . v 1. . , ta li tip tc chia i chng. Qu trnh phn nh
bi ton dng li khi ta nhn c bi ton mng con ch c 1 phn t. T phng
php trnh by trn, ta xy dng th tc quy
find2(l,r,maxDiff,maxValue,minValue)
tm gi tr lch, gi tr ln nht, gi tr nh nht trn mng . . vi
1 .
const MAXN =100000;
fi ='';
fo ='';
var a :array[1..MAXN]of longint;
n :longint;
maxdiff :longint;
tmp1,tmp2 :longint;
procedure find2(l,r:longint;var
maxDiff,maxValue,minValue :longint);
var mid :longint;
maxD1, maxV1, minV1 :longint;
maxD2, maxV2, minV2 :longint;
begin
if l=r then begin
maxDiff:=0;
maxValue:=a[r];

92
minValue:=a[r];
end
else begin
mid:=(l+r) div 2;
find2(l, mid, maxD1, maxV1,minV1);
find2(mid+1, r, maxD2, maxV2, minV2);
maxDiff:=maxV2 - minV1;
if maxDiff < maxD1 then maxDiff := maxD1;
if maxDiff < maxD2 then maxDiff := maxD2;
if maxV1 > maxV2 then
maxValue:=maxV1 else maxValue:=maxV2;
if minV1 < minV2 then
minValue:=minV1 else minValue:=minV2;
end;
end;
procedure input;
var f :text;
i :longint;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
close(f);
end;
BEGIN
input;
find2(1,n,maxDiff,tmp1,tmp2);
writeln(maxDiff);
END.
Gi l s php ton cn thc hin trn mng phn t 1. . , ta c:

0 1

2
1

Gi s, 2

, bng phng php th ta c:


2

22

222

2 2

2 1
2

1 2

2 2

1 1

93
phc tp thut ton l:
4.4. Lt nn
Hy lt nn nh hnh vung cnh 2

2 10 b khuyt mt phn t ti
gc trn phi (khuyt phn 2) bng nhng vin gch hnh thc th to bi 3
vung n v.

Nn nh Gch hnh thc th Mt cch lt nn
Gii. Ta chia nn nh thnh 4 phn (hnh bn
phi), mi phn c hnh dng ging vi hnh
ban u nhng c cnh gim i mt na. Nh
vy, nu c th lt nn vi kch thc 2

th ta
hon ton c th lt nn vi kch thc 2

.
Th tc quy cover(x,y,s,t) di y
s lt nn c kch thc , b khuyt phn
1,2,3,4 c ta tri trn l , .
const MAXSIZE =1 shl 10;
var a :array[1..MAXSIZE,1..MAXSIZE]of longint;
count,k :longint;
procedure cover(x,y,s,t:longint);
begin
if s = 2 then begin
inc(count);
if t<>1 then a[x,y]:=count;
if t<>2 then a[x,y+1]:=count;
if t<>3 then a[x+1,y]:=count;
if t<>4 then a[x+1,y+1]:=count;
exit;

94
end;
if t=1 then begin
cover(x,y+s div 2,s div 2,3);
cover(x+s div 2,y,s div 2,2);
cover(x+s div 2,y+s div 2,s div 2,1);
cover(x+s div 4,y+s div 4,s div 2,1);
end;
if t=2 then begin
cover(x,y,s div 2,4);
cover(x+s div 2,y,s div 2,2);
cover(x+s div 2,y+s div 2,s div 2,1);
cover(x+s div 4,y+s div 4,s div 2,2);
end;
if t=3 then begin
cover(x,y,s div 2,4);
cover(x,y+s div 2,s div 2,3);
cover(x+s div 2,y+s div 2,s div 2,1);
cover(x+s div 4,y+s div 4,s div 2,3);
end;
if t=4 then begin
cover(x,y,s div 2,4);
cover(x+s div 2,y,s div 2,2);
cover(x,y+s div 2,s div 2,3);
cover(x+s div 4,y+s div 4,s div 2,4);
end;
end;
procedure output;
var i,j :longint;
f :text;
begin
assign(f,'cover.out'); rewrite(f);
for i:=1 to 1 shl k do
begin
for j:=1 to 1 shl k do write(f,a[i,j],' ');
writeln(f);
end;

95
close(f);
end;
BEGIN
write('k=');readln(k);
cover(1,1,1 shl k,2);
output;
END.
V d v Input / Output ca chng trnh:
k = 3 1 1 3 3 0 0 0 0
1 4 4 3 0 0 0 0
2 4 13 13 0 0 0 0
2 2 13 16 0 0 0 0
5 5 14 16 16 15 9 9
5 8 14 14 15 15 12 9
6 8 8 7 10 12 12 11
6 6 7 7 10 10 11 11
4.5. Thp H Ni
Cho 3 ci cc v a c kch thc
khc nhau. Ban u c a u cc 1
v c xp theo th t a to di,
a nh trn. Hy di chuyn c a t
cc 1 sang cc 3 theo quy tc sau:
- Mt ln ch c chuyn mt a
- Trong qu trnh chuyn a, c th s
dng cc 2 lm cc trung gian v mt
a ch c t ln mt a ln hn.
Gii
chuyn a t cc 1 sang cc 3 ta s thc hin nh sau:
- chuyn 1 a t cc 1 sang cc 2, s dng cc 3 lm cc trung gian
- chuyn 1 a t cc 1 sang cc 3
- chuyn 1 a t cc 2 sang cc 3, s dng cc 1 lm cc trung gian

96

procedure move(n :longint;src,dst,tmp:longint);
begin
if n = 1 then writeln('move ',src,' ',dst)
else begin
move(n-1,src,tmp,dst);
move(1,src,dst,tmp);
move(n-1,tmp,dst,src);
end;
end;
4.6. Bi ton sp xp mng bng thut ton trn (Merge Sort)
Bi ton: Cho mng s nguyn 1. . , cn sp xp cc phn t ca mng theo
th t tng dn.
Gii: Ta chia mng 1. . thnh hai mng con 1. . v 1. . trong
2. Gi s, hai mng con 1. . v 1. . c sp xp
tng dn, ta s trn hai mng con c mng 1. . cng sp xp tng dn.
sp xp hai mng con 1. . v 1. . ta li tip tc chia i chng.
Th tc quy MergeSort(i,j) sp xp tng dn mng con . . vi 1
. sp xp c mng 1. . , ta ch cn gi th tc ny vi 1, .
procedure MergeSort(i,j:longint);
var k : longint;
begin
if (i<j) then begin
k:=(i+j) div 2;
MergeSort(i,k);
MergeSort(k+1,j);
Merge(i,k,j);
{th tc Merge(i,k,j) trn hai mng con A[i..k], A[(k+1)..j] c
sp xp thnh mng A[i..j] cng c sp xp}
end;
end;

97
Vic trn hai mng con c sp xp . . v 1. . thnh mng
. . cng c sp xp c th thc hin trong thi gian 1, l bi tp
3.8 chuyn Sp xp. Thut ton MergeSort c phc tp l .
5. Quy hoch ng (Dynamic programming)
5.1. Phng php
Trong chin lc chia tr, ngi ta phn bi ton cn gii thnh cc bi ton
con. Cc bi ton con li c tip tc phn thnh cc bi ton con nh hn, c
th tip tc cho ti khi ta nhn c cc bi ton con c th gii c d dng.
Tuy nhin, trong qu trnh phn chia nh vy, c th ta s gp rt nhiu ln cng
mt bi ton con. T tng c bn ca phng php quy hoch ng l s dng
mt bng lu gi li gii ca cc bi ton con c gii. Khi gii mt bi
ton con cn n nghim ca bi ton con c nh hn, ta ch cn ly li gii
trong bng m khng cn phi gii li. Chnh v th m cc thut ton c thit
k bng quy hoch ng s rt hiu qu.
gii quyt mt bi ton bng phng php quy hoch ng, chng ta cn tin
hnh nhng cng vic sau:
- Tm nghim ca cc bi ton con nh nht.
- Tm ra cng thc (hoc quy tc) xy dng nghim ca bi ton con thng
qua nghim ca cc bi ton con c nh hn.
- To ra mt bng lu gi cc nghim ca cc bi ton con. Sau tnh
nghim ca cc bi ton con theo cng thc tm ra v lu vo bng.
- T cc bi ton con gii tm nghim ca bi ton.
Sau y, chng ta s tm hiu mt s v d minh ha cho phng php quy
hoch ng.
5.2. S Fibonacci
S Fibonacci c xc nh bi cng thc:

2

Hy xc nh s Fibonacci th .
Cch 1: p dng phng php chia tr, ta tnh

da vo

.

98
function F(n: longint): int64;
begin
if n <=1 then F := n
else F := F(i - 1) + F(i - 2);
end;
BEGIN
readln(n);
Writeln(F(n));
END.
Hm quy F(n) tnh s Fibonacci th . V d 6, chng trnh chnh gi
F(6), n s gi tip F(5) v F(4) tnh ... Qu trnh tnh ton c th v nh cy
di y. Ta nhn thy tnh F(6) n phi tnh 1 ln F(5), hai ln F(4), ba ln
F(3), nm ln F(2), ba ln F(1).

Cch 2: Phng php quy hoch ng.
Ta s dng mng S[0..MaxN], S[i] lu li li gii cho bi ton tnh s
Fibonacci th i.
const MaxN =50;
var S :array[0..MaxN]of int64;
n,k :longint;
function F(n:longint):int64;
begin
if S[n]=-1 then
begin
{bi ton cha c gii th s tin hnh gii}
if n<=1 then S[n]:=n
else S[n]:=F(n-1) + F(n-2);
end;
{nu bi ton c gii th khng cn gii na m ly lun kt qu}
F(6)
F(5) F(4)
F(3) F(2)
F(2) F(1)
F(4)
F(3) F(2)
F(2) F(1)
F(3)
F(2) F(1)

99
F:=S[n];
end;
BEGIN
readln(n);
for k:=0 to MaxN do S[k]:=-1;
writeln(F(n));
END.
Ta nhn thy, mi bi ton con ch c gii ng mt ln. Hy ci t c 2
chng trnh trn v th chy vi 40 thy c s khc bit!
Ta cng c th ci t phng php quy hoch ng cho bi ton nh sau:
const maxN =50;
var S : array[0..maxN] of Int64;
i : longint;
BEGIN
readln(n);
S[0] := 1; S[1] := 1;
for i := 2 to n do
S[i] := S[i - 1] + S[i - 2];
Writeln(S[n]);
END.
Trc ht n tnh sn S[0] v S[1], t tnh tip S[2], li tnh tip c S[3],
S[4],.., S[n]. m bo rng mi gi tr Fibonacci ch phi tnh 1 ln.
5.3. Dy con n iu tng di nht
Cho dy s nguyn A = a
1
, a
2
, ..., a
n
. (n 1000, -10000 a
i
10000). Mt dy
con ca A l mt cch chn ra trong A mt s phn t gi nguyn th t. Nh vy
A c 2
n
dy con.
Yu cu: Tm dy con n iu tng ca A c di ln nht.
V d: A = (1, 2, 3, 4, 9, 10, 5, 6, 7, 8). Dy con n iu tng di nht l: (1, 2, 3,
4, 5, 6, 7, 8).
Gii
B sung vo A hai phn t: a
0
= - v a
n+1
= +. Khi dy con n iu tng
di nht chc chn s bt u t a
0
v kt thc a
n+1
.
Vi i: 0 i n + 1. Ta s tnh L[i] = di dy con n iu tng di nht bt
u ti a
i
.

100
1. Bi ton nh nht
L[n + 1] = di dy con n iu tng di nht bt u ti a
n+1
= +. Dy con
ny ch gm mi mt phn t (+) nn L[n + 1] = 1.
2. Cng thc
Gi s vi i t n n 0, ta cn tnh L[i]: di dy con tng di nht bt u ti a
i
.
L[i] c tnh trong iu kin L[i + 1], L[i + 2], ..., L[n + 1] bit:
Dy con n iu tng di nht bt u t a
i
s c thnh lp bng cch ly a
i

ghp vo u mt trong s nhng dy con n iu tng di nht bt u ti v tr
a
j
ng sau a
i
.
Ta s chn dy no ghp a
i
vo u? Tt nhin l ch c ghp a
i
vo u
nhng dy con bt u ti a
j
no ln hn a
i
( m bo tnh tng) v d nhin
ta s chn dy di nht ghp a
i
vo u ( m bo tnh di nht). Vy L[i]
c tnh nh sau:
Xt tt c cc ch s j trong khong t i + 1 n n + 1 m a
j
> a
i
, chn ra ch s
jmax c L[jmax] ln nht. t L[i] := L[jmax] + 1.
3. Truy vt
Ti bc xy dng dy L, mi khi tnh L[i] := L[jmax] + 1, ta t T[i] = jmax.
lu li rng: Dy con di nht bt u ti a
i
s c phn t th hai k tip l
a
jmax
. Sau khi tnh xong hay dy L v T, ta bt u t 0. T[0] l phn t u tin
c chn,
T[T[0]] l phn t th hai c chn,
T[T[T[0]]] l phn t th ba c chn ...
Qu trnh truy vt c th din t nh sau:
i := T[0];
while i <> n + 1 do
{Chng no cha duyt n s an+1=+ cui}
begin
<Thng bo chn a
i
>
i := T[i];
end;
V d: vi A = (5, 2, 3, 4, 9, 10, 5, 6, 7, 8).
Hai dy Length v Trace sau khi tnh s l:


101
i 0 1 2 3 4 5 6 7 8 9 10 11
a
i
- 5 2 3 4 9 10 5 6 7 8 +
Length[i] 9 5 8 7 6 3 2 5 4 3 2 1
Trace[i] 2 8 3 4 7 6 11 8 9 10 11

Const max = 1000;
var
a, L, T: array[0..max + 1] of longint;
n: longint;
procedure Enter; {Nhp d liu}
var
i: longint;
begin
Write('n = '); Readln(n);
for i := 1 to n do
begin
Write('a[', i, '] = '); Readln(a[i]);
end;
end;
procedure Optimize; {Quy hoch ng}
var
i, j, jmax: longint;
begin
a[0] := -32768; a[n + 1] := 32767; {Thm hai phn t canh hai
u dy a}
L[n + 1] := 1; {in c s quy hoach ng vo bng phng n}
for i := n downto 0 do
begin
{Chn trong cc ch s j ng sau i tho mn aj > ai ra ch s jmax c L[jmax] ln nht}
jmax := n + 1;
for j := i + 1 to n + 1 do
if (a[j] > a[i]) and (L[j] > L[jmax]) then jmax
:= j;
L[i] := L[jmax] + 1; {Lu di dy con tng di nht bt u ti ai}
T[i] := jmax; {Lu vt: phn t ng lin sau a
i
trong dy con tng
di nht l a
jmax
}
end;
Truy vt

102
Writeln('Length of result : ', L[0] - 2);{Chiu di dy con
tng di nht}
i := T[0]; {Bt u truy vt tm nghim}
while i <> n + 1 do
begin
Writeln('a[', i, '] = ', a[i]);
i := T[i];
end;
end;
begin
Enter;
Optimize;
end.
5.4. Dy con chung di nht
Cho hai s nguyn dng , 0 , 100 v hai dy s nguyn: A
1
,
A
2
,...,

A
M
v B
1
, B
2
,...,

B
N
. Tm mt dy di nht C l dy con chung di nht ca
hai dy A v B, nhn c t A bng cch xo i mt s s hng v cng nhn
c t B bng cch xo i mt s s hng.
D liu vo trong file LCS.INP c dng:
+ Dng th nht cha M s A
1
, A
2
,...,

A
M

+ Dng th hai cha N s B
1
, B
2
,...,

B
N
.
D liu ra trong file LCS.OUT c dng:
+ Dng th nht ghi s k l s s hng ca dy C.
+ Dng th hai cha k s l cc s hng ca dy C.
Gii
Cn xy dng mng L[0..M, 0..N] vi ngha: L[i, j] l di ca dy chung di
nht ca hai dy A[0.. i] v B[0..j].
ng nhin nu mt dy l rng (s phn t l 0) th dy con chung cng l rng
v vy L[0, j] = 0 j, j = 1.. N, L[i, 0] = 0 i, i = 1.. M. Vi M i > 0 v N j >
0 th L[i, j] c tnh theo cng thc truy hi sau:
L[i,j] = Max{L[i, j-1], L[i-1, j], L[i-1, j-1] + x}
(vi x = 0 nu A[i] B[j] , x=1 nu A[i]=B[j])

103
const fi = 'LCS.INP';
fo = 'LCS.OUT';
MaxMN = 100;
var f : text;
a,b : array[0..MaxMN] of longint;
l : array[0..MaxMN,0..MaxMN] of longint;
m,n : longint;
p : array[0..MaxMN] of longint;
count : longint;
procedure Enter;
var f : text;
begin
m := 0;
n := 0;
assign(f,fi);
reset(f);
while not eoln(f) do
begin
inc(m);
read(f,a[m]);
end;
readln(f);
while not eoln(f) do
begin
inc(n);
read(f,b[n]);
end;
close(f);
end;
function max(x,y : longint) : longint;
begin
if x>y then max := y
else max := y;
end;
procedure Optimize;
var i,j : longint;
begin
for i:=1 to m do l[i,0] := 0;
for j:=1 to n do l[0,j] := 0;
for i:=1 to m do
for j:=1 to n do
begin

104
if a[i]=b[j] then l[i,j] := l[i-1,j-1] + 1
else l[i,j] := max(l[i,j-1],l[i-1,j]);
end;
end;
procedure Trace;
var f : text;
i,j : longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,l[m,n]);
i := m;
j := n;
fillchar(p,sizeof(p),0);
count:= 0;
while (i>0) and (j>0) do
begin
if a[i]=b[j] then
begin
inc(count);
p[count] := a[i];
dec(i);
dec(j);
end
else if l[i,j]=l[i,j-1] then dec(j)
else dec(i);
end;
for i:=count downto 1 do write(f,p[i],' ');
close(f);
end;
BEGIN
Enter;
Optimize;
Trace;
END.
5.5. Bi ton ci ti
Trong siu th c n gi hng (n 100), gi hng th i c trng lng l W
i
100
v tr gi V
i
100. Mt tn trm t nhp vo siu th, sc ca tn trm khng th
mang c trng lng vt qu M ( M 100). Hi tn trm s ly i nhng gi
hng no c tng gi tr ln nht.

105
Gii
Nu gi B[i, j] l gi tr ln nht c th c bng cch chn trong cc gi {1, 2, ...,
i} vi gii hn trng lng j. Th gi tr ln nht khi c chn trong s n gi vi
gii hn trng lng M chnh l B[n, M].
1. Cng thc tnh B[i, j].
Vi gii hn trng lng j, vic chn ti u trong s cc gi {1, 2, ...,i - 1, i}
c gi tr ln nht s c hai kh nng:
Nu khng chn gi th i th B[i, j] l gi tr ln nht c th bng cch chn
trong s cc gi {1, 2, ..., i - 1} vi gii hn trng lng l j. Tc l B[i, j] =
B[i - 1, j]
Nu c chn gi th i (tt nhin ch xt ti trng hp ny khi m W
i
j) th
B[i, j] bng gi tr gi th i l V
i
cng vi gi tr ln nht c th c c bng
cch chn trong s cc gi {1, 2, ..., i - 1} vi gii hn trng lng j - W
i
. Tc
l v mt gi tr thu c: B[i, j] = V
i
+ B[i - 1, j - W
i
]
V theo cch xy dng B[i, j] l gi tr ln nht c th nn n s l max trong hai
gi tr thu c trn.
2. C s quy hoch ng:
D thy B[0, j] = gi tr ln nht c th bng cch chn trong s 0 gi = 0.
3. Tnh bng phng n:
Bng phng n B gm n + 1 dng, M + 1 ct, trc tin c in c s quy
hoch ng: Dng 0 gm ton s 0. S dng cng thc truy hi, dng dng 0 tnh
dng 1, dng dng 1 tnh dng 2, v.v... n khi tnh ht dng n.
0 1 ... M
0 0 0 0 0
1
2
... ...
n

106
4. Truy vt:
Tnh xong bng phng n th ta quan tm n b[n, M] chnh l gi tr ln nht
thu c khi chn trong c n gi vi gii hn trng lng M. Nu b[n, M] = b[n -
1, M] th tc l khng chn gi th n, ta truy tip b[n - 1, M]. Cn nu b[n, M]
b[n - 1, M] th ta thng bo rng php chn ti u c chn gi th n v truy tip
b[n - 1, M - W
n
]. C tip tc cho ti khi truy ln ti hng 0 ca bng phng n.
const
max = 100;
var
W, V : array[1..max] of longint;
B : array[0..max, 0..max] of longint;
n, M : longint;
procedure Enter;
var
i: longint;
begin
Write('n = '); Readln(n);
for i := 1 to n do
begin
Writeln('Pack ', i);
Write(' + Weight : '); Readln(W[i]);
Write(' + Value : '); Readln(V[i]);
end;
Write('M = '); Readln(M);
end;
procedure Optimize;
var
i, j: longint;
begin
FillChar(B[0], SizeOf(B[0]), 0);
for i := 1 to n do
for j := 0 to M do
begin
B[i, j] := B[i - 1, j];
if (j >= W[i]) and (B[i, j] < B[i-1,j-W[i]] + V[i])
then
B[i, j] := B[i - 1, j - W[i]] + V[i];
end;

107
end;
procedure Trace;
begin
Writeln('Max Value : ', B[n, M]);
Writeln('Selected Packs: ');
while n <> 0 do
begin
if B[n, M] <> B[n - 1, M] then
begin
Writeln('Pack ', n, ' W = ', W[n], ' Value = ', V[n]);
M := M - W[n];
end;
Dec(n);
end;
end;
BEGIN
Enter;
Optimize;
Trace;
END.
Bi tp
4.1. Cho danh sch tn ca 10 hc sinh (cc tn i mt khc nhau) v
mt s nguyn dng . Hy lit k tt c cc cch chn hc sinh
trong hc sinh.
V d:
D liu vo Kt qu ra
4, 2, danh sch
tn hc sinh nh sau:
An
Binh
Hong
Minh
C 6 cch chn 2 hc sinh trong
4 hc sinh:
1. An Binh
2. An Hong
3. An Minh
4. Binh Hong
5. Binh Minh
6. Hong Minh

108
4.2. Mt dy nh phn di 10 l mt dy

trong

0,1, 1,2, . . , . Hy lit k tt c cc dy nh phn di


D liu vo Kt qu ra
3

C 8 dy nh phn di 3
1. 000
2. 001
3. 010
4. 011
5. 100
6. 101
7. 110
8. 111
4.3. Cho xu S ( di khng vt qu 10) ch gm cc k t n (cc k
t trong xu S i mt khc nhau). Hy lit k tt c cc hon v khc nhau
ca xu S.
D liu vo Kt qu ra
S='XYZ' C 6 hon v khc nhau ca 'XYZ'
1. XYZ
2. XZY
3. YXZ
4. YZX
5. ZXY
6. ZYX
4.4. Cho s nguyn dng 20,hy lit k tt c cc xu di ch gm
2 k t hoc m khng c 2 k t no ng cnh nhau.
D liu vo Kt qu ra
4

C 8 xu di 4
1. AAAA
2. AAAB
3. AABA
4. ABAA
5. ABAB

109
6. BAAA
7. BAAB
8. BABA
4.5. Cho dy s gm 10 s nguyn

, ,

v mt s nguyn
dng 1 ). Hy a ra mt cch chia dy s thnh nhm m
cc nhm c tng bng nhau.
D liu vo Kt qu ra
N=5, S=3
Dy s a:
1, 4, 6, 9, 10
nhm 1: 4, 6
nhm 2: 1, 9
nhm 3: 10
4.6. Mt xu X = x
1
x
2
..x
M
c gi l xu con ca xu Y = y
1
y
2
..y
N
nu ta c th
nhn c xu X t xu Y bng cch xo i mt s k t, tc l tn ti mt
dy cc ch s:
1

, ,


V d: X='adz' l xu con ca xu Y='baczdtz';

7.
Nhp vo mt xu S ( di khng qu 15, ch gm cc k t 'a' n 'z'), hy
lit k tt c cc xu con khc nhau ca xu S.
D liu vo Kt qu ra
S='aba' C 6 xu con khc nhau ca 'aba'
1. a
2. b
3. aa
4. ab
5. ba
6. aba
4.7. Cho s nguyn dng 10, lit k tt c cc cch khc nhau t
du ngoc m v du ngoc ng ng n?
D liu vo Kt qu ra
3 C 5 cch
, , , ,

110
4.8. Cho 10 s nguyn dng

, ,

10

. Tm s nguyn
dng nh nht sao cho khng phn tch c di dng tng ca mt
s cc s (mi s s dng khng qu mt ln) thuc s trn.
D liu vo Kt qu ra
n=4
Dy s a:
1, 2, 3, 6
13
4.9. Cho xu S ( di khng vt qu 10) ch gm cc k t n (cc k
t trong xu S khng nht thit phi khc nhau). Hy lit k tt c cc hon
v khc nhau ca xu S.
D liu vo Kt qu ra
S='ABA' C 3 hon v khc nhau ca 'ABA'
1. AAB
2. ABA
3. BAA
4.10. Bi ton m i tun
Cho bn c , tm cch di chuyn mt qun m (m di chuyn theo
lut c vua) trn bn c xut pht t (1,1) i qua tt c cc , mi qua
ng mt ln.
V d: N=5
1 24 13 18 7
14 19 8 23 12
9 2 25 6 17
20 15 4 11 22
3 10 21 16 5
4.11. S siu nguyn t l s nguyn t m khi b mt s tu cc ch s bn
phi ca n th phn cn li vn to thnh mt s nguyn t.
V d: 2333 l mt s siu nguyn t c 4 ch s v 233, 23, 2 cng l cc
s nguyn t.

111
Cho s nguyn dng N (0< N <10), a ra cc s siu nguyn t c N ch
s cng s lng ca chng.
V d: Vi N=4
C 16 s: 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797
5939 7193 7331 7333 7393
4.12. Cho mt xu S (ch gm cc k t '0' n '9', di nh hn 10) v s
nguyn M, hy a ra mt cch chn vo S cc du '+' hoc '-' thu c
s M cho trc (nu c th).
V d: M = 8, S='123456789' mt cch chn: '-1+2-3+4+5-6+7';
4.13. Trong c vua qun tng ch c th di chuyn theo
ng cho v hai qun tng c th chiu nhau
nu chng nm trn ng di chuyn ca nhau.
Trong hnh bn, hnh vung t m th hin cc v
tr m qun tng B
1
c th i ti c, qun tng
B
1
v B
2
chiu nhau, qun B
1
v B
3
khng chiu
nhau. Cho kch thc N ca bn c v K qun
tng, hi c bao nhiu cch t cc qun tng
vo bn c m cc qun tng khng chiu nhau.

D liu vo trong file: bishops.inp c dng:
- Dng u l s t l s test (t10)
- t dng sau mi dng cha 2 s nguyn dng N, K (2N10, 0<KN
2
)
Kt qu ra file: bishops.out gm t dng, mi cha mt s duy nht l s
cch t cc qun tng vo bn c tng ng vi d liu vo.
4.14. N-mino l hnh thu c t N hnh vung 11 ghp li (cnh k cnh). Hai
n-mino c gi l ng nht nu chng c th t chng kht ln nhau.
Cho s nguyn dng N (1<N<8), tnh v v ra tt c cc N-mino trn mn
hnh.
V d: Vi N=3 ch c hai loi N-mino sau y:

3-mino thng 3-mino hnh thc th
4.15. Trong mc 2.2, li gii bi ton TSP l mt gii php nhnh cn rt th s.
Hy th chy chng trnh vi trng hp nh sau: s thnh ph 20,

112
khong cch gia cc thnh ph bng 1 (ngha l , 1 vi ). Hy
rt ra nhn xt v c th nh gi nhnh cn cht hn na lm tng hiu qu
ca chng trnh.
4.16. Cho bn c quc t 88 , mi ghi mt s nguyn dng khng vt qu
32000.
Yu cu: Xp 8 qun hu ln bn c sao cho khng qun no khng ch
c qun no v tng cc s ghi trn cc m qun hu ng l ln nht.
D liu vo: gm 8 dng, mi dng ghi 8 s nguyn dng, gia cc s
cch nhau mt du cch.
Kt qu ra: mt s duy nht l p s ca bi ton.
D liu vo Kt qu ra
1 2 4 9 3 2 1 4
6 9 5 4 2 3 1 4
3 6 2 3 4 1 8 3
2 3 7 3 2 1 4 2
1 2 3 2 3 9 2 1
2 1 3 4 2 4 2 8
2 1 3 2 8 4 2 1
8 2 3 4 2 3 1 2
66
4.17. Mt chic ba l c th cha c mt khi lng . C 20 vt
c nh s 1, 2, . . , . vt c khi lng

v c gi tr

. Cn chn
cc vt cho vo ba l tng gi tr cc vt l ln nht.
4.18. Dominoes
C N qun Domino xp thnh mt hng
nh hnh v
Mi qun Domino c chia lm hai
phn, phn trn v phn di. Trn mt
mi phn c t 1 n 6 du chm.
Ta nhn thy rng:


Tng s du chm phn trn ca N qun Domino bng: 6+1+1+1=9, tng
s du chm phn di ca N qun Domino bng 1+5+3+2=11, chnh
lch gia tng trn v tng di bng |9-11|=2

113
Vi mi qun, bn c th quay 180
o
phn trn tr thnh phn di, phn
di tr thnh phn trn, v khi chnh lch c th c thay i. V d
nh ta quay qun Domino cui cng ca hnh trn th chnh lch bng 0
Bi ton t ra l: Cn quay t nht bao nhiu qun Domino nht
chnh lch gia phn trn v phn di l nh nht.
D liu vo trong file: DOMINO.INP c dng:
- Dng u l s nguyn dng N (1N20)
- N dng sau, mi dng hai s a
i
, b
i
l s du chm phn trn, s du chm
phn di ca qun Domino th i (1 a
i
, b
i
6)
Kt qu ra file: DOMINO.OUT c dng: Gm 1 dng duy nht cha 2 s
nguyn cch nhau mt du cch l chnh lch nh nht v s qun
Domino cn quay t nht c chnh lch .
4.19. Cho mt li MxN (M, N10) , mi t mt bng n bt hoc tt. Trn
mi dng v mi ct c mt cng tc. Nu tc ng vo cng tc dng i
(i=1..M) hoc cng tc ct j (j=1..N) th tt c cc bng n trn dng i hoc
ct j s thay i trng thi. Hy tm cch tc ng vo cc cng tc c
nhiu n sng nht.
4.20. C 16 ng xu xp thnh bng 4x4, mi ng xu c th p hoc nga nh
hnh v sau:
Mu en th hin ng xu p, mu trng th hin ng xu nga.
Ti mi bc ta c php bin i sau: Chn mt
ng xu v thay i trng thi ca ng xu v
tt c cc ng xu nm cc chung cnh (p
thnh nga, nga thnh p). Cho trc mt trng
thi cc ng xu, hy lp trnh tm s php bin
i t nht a v trng thi tt c cc ng xu
hoc u p hoc u nga.
D liu vo trong file COIN.INP c dng: Gm 4 dng, mi dng 4 k t
'w' - m t trng thi nga hoc 'b'- m t trng thi p.
Kt qu ra file COIN.OUT c dng: Nu c th bin i c ghi s
php bin i t nht nu khng ghi Impossible
COIN.INP COIN.OUT COIN.INP COIN.OUT
bwbw
wwww
Impossible bwwb
bbwb
4

114
bbwb
bwwb
bwwb
bwww
4.21. C N file chng trnh vi dung lng S
1
, S
2
,,S
n
v loi a CD c dung
lng D. Hi cn t nht bao nhiu a CD c th copy tt c cc file
chng trnh (mt file chng trnh ch nm trong mt a CD).
a) Gii bi ton bng phng php nhnh cn vi N10.
b) Gii bi ton bng mt thut ton tham n vi N100.
D liu vo Kt qu ra
N=5, D=700
320, 100, 300, 560, 50
Cn t nht 2 a CD
a 1: 320, 300, 50
a 2: 100, 560
4.22. Chng trnh gii bi ton lp lch gim thiu tr hn ( mc 3.4) c
phc tp

, hy ci tin hm check nhn c chng trnh vi


phc tp

.
4.23. Cho mt xu S ( di khng qu 200) ch gm 3 loi k t

, . Ta
c php i ch hai k t bt k trong xu, hy tm cch bin i t bc nht
c xu theo th t tng dn.
D liu vo Kt qu ra
S='CBABA' Cn t nht 2 php bin i
CBABA ABABC AABBC
4.24. Cho 1000 on s nguyn

, hy chn mt tp gm t s
nht m mi on s nguyn trn u c t nht 2 s thuc tp.
|

|, |

| 10


V d: c 5 on 0,10, 2,3, 4,7, 3,5, 5,8, ta chn tp gm 4 s
{2, 3, 5, 7}
4.25. Cho phn s M/N (0<M<N, M,N nguyn). Hy phn tch phn s ny thnh
tng cc phn s c t s bng 1, cng t s hng cng tt.
D liu vo t file PS.IN cha 2 s M, N
Kt qu ra file PS.OUT
- Dng u l s lng s tch
- Cc dng sau mi dng cha mu s ca cc s hng

115
D liu vo Kt qu ra
5 6 2
2 3
4.26. Cho mt s t nhin N. Hy tm cch phn tch s N thnh cc s nguyn
dng p
1
, p
2
,..,p
k
(vi k>1) sao cho:
- p
1
, p
2
,, p
k
i mt khc nhau
- p
1
+ p
2
+ + p
k
= N
- S=p
1
* p
2
* * p
k
t gi tr ln nht
D liu vo trong file: PT.INP c dng: Gm nhiu test, mi dng l mt
test cha mt s N (5N1000)
Kt qu ra file: PT.OUT c dng: Gm nhiu dng, mi dng l tch ln
nht t c (s S) cho test
D liu vo Kt qu ra
5 6
7 12
4.27. Cho hai php ton *2 (nhn vi 2) v /3 (chia nguyn cho 3). Cho trc s
1, bng cch s dng hai php ton trn ta xy dng c biu thc c gi
tr bng N.
V d N=6 th 1*2*2*2*2*2/3/3*2=6 (thc hin t tri qua phi)
D liu vo t file BT.INP cha s N (N c khng qu 100 ch s)
Ghi kt qu ra file BT.OUT biu thc ngn nht c th
4.28. Cho s nguyn dng N (N10
100
), hy tch N thnh tng t cc s
Fibonacci nht.
V d: N=16=1+5+13
4.29. Cn phi t chc vic thc hin N chng trnh nh s t 1 n N trn mt
my tnh. Mi chng trnh th i i hi thi gian tnh l 1 gi, v nu n
c hon thnh trc thi im d[i] (gi s thi im bt u thc hin cc
chng trnh l 0) th ngi ch my tnh s c tr tin cng l w[i] (i =
1,2,...,N). Vic thc hin mi chng trnh phi c tin hnh lin tc t
lc bt u cho n khi kt thc khng cho php ngt qung, ng thi ti
mi thi im my ch c th thc hin mt chng trnh).
Hy tm trnh t thc hin cc chng trnh sao cho tng tin cng nhn
c l ln nht.

116
D liu vo c cho trong JOB.INP:
- Dng u tin cha s N (N 5000),
- Dng th i trong N dng tip theo cha 2 s d[i], w[i] c ghi cch nhau
bi du cch.
Kt qu a ra file JOB.OUT:
- Dng u tin cha tng tin cng nhn c theo trnh t tm c.
- Dng tip theo ghi trnh t thc hin cc chng trnh.
4.30. Tm K ch s cui cng ca M
N
(0< K 9, 0 M, N 10
9
)
V d: K=2, M=2, N=10, ta c 2
10
=1024, nh vy 2 ch s cui cng ca
2
10
l 24
4.31. Vit hm kim tra tnh nguyn t ca s 10

theo Fermat.
4.32. Lt gch
Cho mt nn nh hnh vung c kch thc 2

b khuyt mt , hy tm
cch lt nn nh bng loi gch hnh thc th (to bi 3 hnh vung
n v).

nn nh ( mu en l khuyt) mt cch lt nn
4.33. Cho dy

, ,

, cc s i mt khc nhau v s nguyn dng


1 . Hy a ra gi tr nh th trong dy.
V d: dy gm 5 phn t: 5, 7, 1, 3, 4 v 3 th gi tr nh th l 4.
4.34. Dy con li
Dy s nguyn A
1
, A
2
, , A
N
c gi l li, nu n gim dn t A
1
n
mt A
i
no , ri tng dn ti A
N
.
V d dy li: 10 5 4 2 1 4 6 8 12
Yu cu: Cho mt dy s nguyn, bng cch xa bt mt s phn t ca
dy v gi nguyn trnh t cc phn t cn li, ta nhn c dy con li di
nht.

117
D liu vo trong file: DS.INP
- Dong u l N (N<=10000)
- Cc dng sau l N s nguyn ca dy s (cc s kiu longint)
Kt qu ra file: DS.OUT
- Ghi s phn t ca dy con tm c
- Cc dng tip theo ghi cc s thuc dy con
4.35. Palindrome
Mt xu c gi l xu i xng nu c t tri qua phi cng ging nh
c t phi qua tri. V d xu madam l mt xu i xng. Bi ton t
ra l cho mt xu S gm cc k t thuc tp ['a'..'z'], hy tm cch chn vo
xu S t nht cc k t xu S thnh xu i xng.
V d: xu adbhbca ta s chn thm 2 k t (c v d) c xu i xng
adcbhbcda.
D liu vo trong file PALIN.INP c dng: Gm mt dng cha xu S. (
di mi xu khng vt qu 200)
Kt qu ghi ra file PALIN.OUT c dng: Gm mt dng l mt xu i
xng sau khi chn thm t k t nht vo xu S.
Palin.inp Palin.out
acbcd adcbcda
4.36. Stones
C N ng si xp thnh mt hng, ng th i c A
i
vin si. Ta c th
ghp hai ng si k nhau thnh mt ng v mt mt chi ph bng tng hai
ng si .
Yu cu: Hy tm cch ghp N ng si ny thnh mt ng vi chi ph l
nh nht.
V d: C 5 ng si
4 1 2 7 5
4 3 7 5
7 7 5
7 12
19
Pht = 3 + 7 + 12 + 19 = 41
D liu vo trong file STONES.INP c dng:

118
- Dng u l s N (N < 101) l s ng si
- Dng th 2 gm N s nguyn l s si ca N ng si. (0 < A
i
< 1001)
Kt qu ra file STONES.OUT c dng: gm mt s l chi ph nh nht
ghp N ng thnh mt ng.
STONES.INP STONES.OUT
5
4 1 2 7 5
41
4.37. Ct hnh 1
C mt hnh ch nht MN , mi ln ta c php ct mt hnh ch nht
thnh hai hnh ch nht con theo chiu ngang hoc chiu dc v li tip tc
ct cc hnh ch nht con cho n khi c hnh vung th dng.
Hi c th ct hnh ch nht MxN thnh t nht bao nhiu hnh vung.
D liu vo trong file HCN.INP:
Gm 1 s dng, mi dng l 1 test l mt cp s M, N (1<=M,N<=100)
Kt qu ra file HCN.INP:
Gm 1 s dng l kt qu tng ng vi d liu vo
4.38. Ct hnh 2
Cho mt bng s A gm M dng, N ct, cc gi tr ca bng A ch l 0
hoc 1. Ta mun ct bng A thnh cc hnh ch nht con sao cho cc hnh
ch nht con c gi tr ton bng 1 hay ton bng 0. Mt ln ct l mt nht
ct thng theo dng hoc theo ct ca mt hnh ch nht thnh hai hnh ch
nht ring bit. C tip tc ct cho n khi hnh ch nht ton bng 1 hay
ton bng 0. Hy tm cch ct c t hnh ch nht nht m cc hnh ch
nht con c gi tr ton bng 1 hay ton bng 0.
V d: Bng s 55 sau c chia thnh 8 hnh ch nht con.

D liu vo trong file HCN2.INP

119
- Dng u l 2 s nguyn dng M, N (M,N30)
- M dng tip theo, mi dng N s ch gm 0 hoc 1 th hin bng s A
Kt qu ra file HCN2
Gm 1 dng duy nht cha mt s duy nht l s hnh ch nht t nht
4.39. TKSEQ
Cho dy s A gm N s nguyn v s nguyn K. Tm dy ch s
1i
1
<i
2
<<i
3K
N sao cho:

. .


t gi tr ln nht.
D liu vo trong file TKSEQ.INP c dng:
- Dng u l gm 2 s nguyn N, K (0<3KN500)
- Dng 2 gm N s nguyn a
1
, a
2
,, a
N
(|a
i
|<10
9
)
Kt qu ra file TKSEQ.OUT c dng: gm mt s duy nht S ln nht
tm c
TKSEQ.INP TKSEQ.OUT
5 1
1 2 3 4 5
4
4.40. Least-Squares Segmentation
Ta nh ngha trng s ca on s t s v tr th i n v tr th j ca dy
s nguyn A[1], A[2], ..., A[N] l:

trong

/ 1
Yu cu: Cho dy s nguyn A gm N s A[1], A[2], ..., A[N] v s nguyn
dng G (1 < G
2
< N). Hy chia dy A thnh ng G on tng trng s
l nh nht.
D liu vo trong file vn bn LSS.INP c dng:
- Dng u gm hai s N v G (1 < G
2
< N < 1001)
- N dng tip theo, mi dng mt s nguyn m t dy s A (0<A[i]<10
6
)
Kt qu ra file vn bn LSS.OUT c dng: gm mt dng cha mt s
thc duy nht l p n ca bi ton. (a ra theo quy cch :0:2)
LSS.INP LSS.OUT
5 2
3
0.50

120
3
3
4
5

4.41. Phn trang ( thi chn i tuyn quc gia 1999)
Vn bn l mt dy gm N t nh s t 1 n N. T th i c di l w
i
(i=1, 2,... N). Phn trang l mt cch xp ln lt cc t ca vn bn vo
dy cc dng, mi dng c di L, sao cho tng di ca cc t trn
cng mt dng khng vt qu L. Ta gi h s pht ca mi dng trong
cch phn trang l hiu s (L-S), trong S l tng di ca cc t xp
trn dng . H s pht ca cch phn trang l gi tr ln nht trong s cc
h s pht ca cc dng.
Yu cu: Tm cch phn trang vi h s pht nh nht.
D liu vo t tp vn bn PTRANG.INP
- Dng 1 cha 2 s nguyn dng N, L (N<=4000, L<=70)
- Dng th i trong s N dng tip theo cha s nguyn dng w
i
(w
i
<=L),
i=1, 2,.., N
Kt qu ghi ra file vn bn PTRANG.OUT
- Dng 1 ghi 2 s P, Q theo th t l h s pht v s dng theo cch phn
trang tm c
- Dng th i trong s Q dng tip theo ghi ch s ca cc t trong dng th i
ca cch phn trang.
4.42. Chn s
Cho mng A c kch thc NxN gm cc s nguyn khng m. Hy chn ra
K s sao cho mi dng c nhiu nht 1 s c chn, mi ct c nhiu nht
1 s c chn tng K s l ln nht.
D liu vo t tp vn bn SELECT.INP
- Dng th nht gm 2 s N v 15
- N dng sau, mi dng N s nguyn khng m

10000
Kt qu ghi ra file vn bn SELECT.OUT
Tng ln nht chn c v s cch chn (cch nhau ng mt du cch)

121
Select.inp Select.out
3 2
1 2 3
2 3 1
3 1 2
6 3
4.43. Puzzle of numbers
Khi mt s phn ch s trong ng thc ng ca tng hai s nguyn b mt
(c thay bi cc du sao *). C mt cu l: Hy thay cc du sao bi
cc ch s cho ng thc vn ng.
V d bt u t ng thc sau:
9334
789
--------
10123 (9334+789=10123)
Cc v d cc ch s b mt c thay bng cc du sao nh sau:
*3*4 hay ****
78* ***
10123 *****
Nhim v ca bn l vit chng trnh thay cc du sao thnh cc ch s
c mt ng thc ng. Nu c nhiu li gii th a ra mt trong s .
Nu khng c th a ra thng bo: No Solution.
Ch cc ch s u mi s phi khc 0.
D liu vo trong file REBUSS.INP: gm 3 dng, mi dng l mt xu k
t gm cc ch s hoc k t * . di mi xu khng qu 50 k t.
Dng 1, dng 2 th hin l hai s c cng, dng 3 th hin l tng hai s.
Kt qu ra file REBUSS.OUT: Nu c li gii th file kt qu gm 3
dng tng ng vi file d liu vo, nu khng th thng bo No Solution
REBUSS.INP REBUSS.OUT
*3*4
78*
10123
9334
789
10123

122
4.44. Xp lch ging
Mt gio vin cn ging vn c nh s t 1 n 10000.
Mi mt vn cn c thi gian l

1. . . ging vn
th gio vin c cc bui c phn c di l 500.
Mt vn th phi gii quyt trong mt bui .
Vn phi c ging trc vn 1 vi mi 1. . 1 .
Hc sinh c th ra v sm nu nh bui ging kt thc, tuy nhin nu
thi gian ra v qu sm so vi bui ging th tht l ph. Chnh v th
ngi ta nh gi bui ln lp bng gi tr nh sau :

0 0
1 10
10

10


Trong l thi gian tha ca bui ln lp , l mt hng s .
Yu cu: Hy xp lch dy sao cho tng s cc bui l cn t nht c th
c. Trong cc lch dy t nht , hy tm lch dy sao cho tng s l
nh nht c th c.
D liu vo t file SCHEDULING.INP
- Dng u l s n (s vn cn ging) .
- Dng tip theo l L v C
- Dng cui cng l N s th hin cho

, ,

.
Kt qu ra file SCHEDULING.OUT
- Dng u tin l s bui .
- Dng tip theo l tng nh nht t c .
SCHEDULING.INP SCHEDULING.OUT
10
120 10
80 80 10 50 30 20 40 30 120 100
6
2700
4.45. Khu vn (IOI 2008)
Ramsesses II thng trn tr v. ghi nhn chin tch ca mnh ng quyt
nh xy mt khu vn trng l. Khu vn phi c mt hng cy chy di t
cung in ca ng ti Luxor ti thnh ng Karnak. Hng cy ny ch
cha hai loi cy l sen v ci giy, bi v chng tng ng l biu tng
ca min Thng Ai Cp v H Ai Cp.

123
Vn phi c ng N cy. Ngoi ra, phi c s cn bng: mi on cy
lin tip ca vn, s lng sen v s lng ci giy phi khng lch nhau
qu 2.
Vn cy c biu din di dng xu cc k t 'L' (lotus sen) v 'P'
(papyrus ci giy). V d, vi N = 5 c tt c 14 vn m bo cn bng.
Theo th t t in, cc vn l: LLPLP, LLPPL, LPLLP, LPLPL,
LPLPP, LPPLL, LPPLP, PLLPL, PLLPP, PLPLL, PLPLP, PLPPL, PPLLP
v PPLPL.
Cc vn cn bng vi di xc nh cho trc c sp xp theo th t
t in v c nh s t 1 tr i. V d, vi N=5, vn s 12 s l vn
PLPPL.
NHIM V
Cho s cy N v xu biu din mt vn cn bng, hy lp trnh tnh s th
t ca vn ny theo moun M, trong M l s nguyn cho trc.
Lu rng gi tr ca M khng ng vai tr quan trng trong vic gii bi
ton, n ch lm cho vic tnh ton tr nn n gin.
HN CH
1 <= N <= 1 000 000
7 <= M <= 10 000 000
CHM IM
C 40 im dnh cho cc d liu vo vi N khng vt qu 40.
INPUT
Chng trnh ca bn phi c t file GARDEN.INP cc d liu sau:
Dng 1 cha s nguyn N, s cy trong vn,
Dng 2 cha s nguyn M,
Dng 3 cha xu gm N k t 'L' (sen) hoc 'P' (ci giy) biu din
vn cn bng.
OUTPUT
Chng trnh ca bn phi ghi ra file GARDEN.OUT mt dng cha mt
s nguyn trong phm vi t 0 n M-1, l s th t t theo mun M ca
vn c m t trong u vo.
Input v
d 1
Output v
d 1
Gii thch

124
5
7
PLPPL
5 S th t ca PLPPL l 12. Nh vy
output l 12 theo mun 7, tc l
5.

Input v d 2 Output v d 2
12
10000
LPLLPLPPLPLL
39
4.46. S r rng
Bm mi tm c mt ti liu nh ngha s r rng nh sau: Vi s
nguyn dng , ta to s mi bng cch ly tng bnh phng cc ch s
ca n, vi s mi ny ta li lp li cng vic trn. Nu trong qu trnh ,
ta nhn c s mi l 1, th s ban u c gi l s r rng. V d, vi
n = 19, ta c:
19 82 (= 1
2
+9
2
) 68 100 1
Nh vy, 19 l s r rng.
Khng phi mi s u r rng. V d, vi n = 12, ta c:
12 5 25 29 85 89 145 42 20 4 16 37 58
89 145
Bm rt thch th vi nh ngha s r rng ny v thch ph ng: Cho
mt s nguyn dng , tm s l s r rng lin sau s , tc l
l s r rng nh nht ln hn . Tuy nhin, cu hi qu d vi ph ng
v ph ng li Bm: Cho hai s nguyn dng v k (1 ,
10

), hy tm s

l s r rng lin sau th


ca .
Bn hy gip Bm gii cu ny nh!
D liu vo t file vn bn CLEAR.INP c dng:
- Dng u l s 0 20
- dng sau, mi dng cha 2 s nguyn v .
Kt qu ra file vn bn CLEAR.OUT gm dng, mi dng l kt qu
tng ng vi d liu vo.

125
CLEAR.INP CLEAR.OUT
2
18 1
1 145674807
19
1000000000
4.47. Hi nm
B Bng i hi nm trong N khu rng nh s t 1 n N, nhng ch c M
khu rng c nm. Vic di chuyn t khu rng th i sang khu rng th j tn
t
ij
n v thi gian. n khu rng i c nm, c b c th dng li hi
nm. Nu tng s n v thi gian c b dng li khu rng th i l d
i

(d
i
>0), th c b hi c:

. .

cy nm ti khu rng
(trong S
i
l s lng nm c ti khu rng i, [x] l phn nguyn ca x).
Gi thit rng ban u c b khu rng th nht v i hi nm trong thi
gian khng qu P n v.
Yu cu: Hy tnh s lng cy nm nhiu nht m c b c th hi c.
D liu vo t file vn bn MUSHROOM.INP:
Dng u tin cha ba s nguyn dng M (M 10), N (0<M N
100) v P (P 10000);
M dng tip theo, mi dng cha 2 s nguyn dng r v S
r
ngha l
khu rng r c S
r
nm (S
r
10
9
);
Dng th i trong N dng cui cng cha N s nguyn dng t
ij
(t
ij

10000), (i, j=1, ..., N ).
Kt qu ghi ra file vn bn MUSHROOM.OUT: s lng cy nm nhiu
nht b Bng c th hi c.
MUSHROOM.INP MUSHROOM.OUT
2 2 2
1 5
2 10
0 3
3 0
3




126
Chuyn 5
CC THUT TON
TRN TH
Trn thc t c nhiu bi ton lin quan ti mt tp cc
i tng v nhng mi lin h gia chng, i hi
ton hc phi t ra mt m hnh biu din mt cch
cht ch v tng qut bng ngn ng k hiu, l
th: mt m hnh ton hc gm cc nh biu din cc
i tng v cc cnh biu din mi quan h gia cc
i tng.
Nhng tng c bn ca th c a ra t th k
th XVIII bi nh ton hc Thu S Leonhard Euler,
nm 1736, ng dng m hnh th gii bi ton v by cy cu
Knigsberg (Seven Bridges of Knigsberg). Bi ton ny cng vi bi
ton m i tun (Knight Tour) c coi l nhng bi ton u tin ca l
thuyt th.
Rt nhiu bi ton ca l thuyt th tr thnh ni ting v thu ht
c s quan tm ln ca cng ng nghin cu. V d bi ton bn
mu, bi ton ng cu th, bi ton ngi du lch, bi ton ngi
a th Trung Hoa, bi ton ng i ngn nht, lung cc i trn
mng v.v Trong phm vi mt chuyn , khng th trnh by tt c
nhng g pht trin trong sut gn 300 nm, chng ta s xem xt l
thuyt th di gc ngi lp trnh, tc l kho st nhng thut
ton c bn nht c th d dng ci t trn my tnh mt s ng dng
ca n. Cng vic ca ngi lp trnh l c hiu c tng c bn
ca thut ton v ci t c chng trnh trong bi ton tng qut
cng nh trong trng hp c th.

Leonhard Euler
1707-1783

127
1. Cc khi nim c bn
1.1. th
th l m hnh biu din mt tp cc i tng v mi quan h hai ngi gia
cc i tng:

,
C th nh ngha th G l mt cp , : , . Trong l tp cc
nh (vertices) biu din cc i tng v gi l tp cc cnh (edges) biu din
mi quan h gia cc i tng. Chng ta quan tm ti mi quan h hai ngi
(pairwise relations) gia cc i tng nn c th coi l tp cc cp , vi
v l hai nh ca biu din hai i tng c quan h vi nhau.
Mt s hnh nh ca th:

Hnh 5-1. V d v m hnh th
C th phn loi th , theo c tnh v s lng ca tp cc cnh :
c gi l n th (hay gi tt l th) nu gia hai nh , c
nhiu nht l 1 cnh trong ni t ti .
c gi l a th (multigraph) nu gia hai nh , c th c
nhiu hn 1 cnh trong ni v (Hin nhin n th cng l a th).
Nu c nhiu cnh ni gia hai nh , th nhng cnh c gi l
cnh song song (parallel edges)
c gi l th v hng (undirected graph) nu cc cnh trong l
khng nh hng, tc l cnh ni hai nh , bt k cng l cnh ni
hai nh , . Hay ni cch khc, tp gm cc cp , khng tnh th t:
, , .
c gi l th c hng (directed graph) nu cc cnh trong l c
nh hng, tc l c th c cnh ni t nh ti nh nhng cha chc
c cnh ni t nh ti nh . Hay ni cch khc, tp gm cc cp ,

128
c tnh th t: , , . Trong th c hng, cc cnh cn c gi
l cc cung (arcs). th v hng cng c th coi l th c hng nu
nh ta coi cnh ni hai nh , bt k tng ng vi hai cung , v
, .
Hnh 5-2 l v d v n th/a th c hng/v hng.

Hnh 5-2. Phn loi th
1.2. Cc khi nim
Nh trn nh ngha th , l mt cu trc ri rc, tc l cc tp v
l tp khng qu m c, v vy ta c th nh s th t 1, 2, 3 cho cc
phn t ca tp V v v ng nht cc phn t ca tp v vi s th t ca
chng. Hn na, ng trn phng din ngi lp trnh cho my tnh th ta ch
quan tm n cc th hu hn ( v l tp hu hn) m thi, chnh v vy t
y v sau, nu khng ch thch g thm th khi ni ti th, ta hiu rng l
th hu hn.
a) Cnh lin thuc, nh k, bc
i vi th v hng , . Xt mt cnh , nu , th ta
ni hai nh v l k nhau (adjacent) v cnh ny lin thuc (incident) vi
nh v nh .
Vi mt nh trong th v hng, ta nh ngha bc (degree) ca , k hiu
deg l s cnh lin thuc vi . Trn n th th s cnh lin thuc vi
cng l s nh k vi .
V hng
n th
a th
C hng
V hng
C hng

129
nh l 5-1
Gi s , l th v hng, khi tng tt c cc bc nh
trong s bng hai ln s cnh:
deg

2||
(1)
Chng minh
Khi ly tng tt c cc bc nh tc l mi cnh , s c tnh mt ln
trong deg v mt ln trong deg. T suy ra kt qu.
H qu
Trong th v hng, s nh bc l l s chn.
i vi th c hng , . Xt mt cung , nu , th ta
ni ni ti v ni t , cung l i ra khi nh v i vo nh . nh
khi c gi l nh u, nh c gi l nh cui ca cung .
Vi mi nh trong th c hng, ta nh ngha: Bn bc ra (out-degree) ca
k hiu deg

l s cung i ra khi n; bn bc vo (in-degree) k hiu


deg

l s cung i vo nh .
nh l 5-2
Gi s , l th c hng, khi tng tt c cc bn bc ra
ca cc nh bng tng tt c cc bn bc vo v bng s cung ca th
deg

deg

||


(2)
Chng minh
Khi ly tng tt c cc bn bc ra hay bn bc vo, mi cung , s c tnh
ng mt ln trong deg

v cng c tnh ng mt ln trong deg

. T
suy ra kt qu.
b) ng i v chu trnh
Mt dy cc nh:

, ,


sao cho

, : 1 c gi l mt ng i (path), ng i
ny gm 1 nh

, ,

v cnh

, ,

. Nu
c mt ng i nh trn th ta ni

n c (reachable) t

hay

n c

, k hiu

. nh

c gi l nh u v nh

gi l nh cui ca
ng i . Cc nh

, ,

c gi l nh trong ca ng i

130
Mt ng i gi l n gin (simple) hay ng i n nu tt c cc nh trn
ng i l hon ton phn bit (d nhin khi cc cnh trn ng i cng hon
ton phn bit). ng i

, ,

tr thnh chu trnh (circuit) nu

. Trn th c hng, chu trnh c gi l chu trnh n nu n c t


nht mt cung v cc nh

, ,

hon ton phn bit. Trn th v


hng, chu trnh c gi l chu trnh n nu 3 v cc nh

, ,


hon ton phn bit.
c) Mt s khi nim khc
ng cu
Hai th , v

c gi l ng cu (isomorphic) nu tn
ti mt song nh : sao cho s cung ni vi trn bng s cung ni
vi trn

.
th con
th

l th con (subgraph) ca th , nu v
.
th con

c gi l th con cm ng (induced graph) t th


bi tp nu

, : , trong trng hp ny chng ta


cn ni

l th hn ch trn .
Phin bn c hng/v hng
Vi mt th v hng , , ta gi phin bn c hng (directed
version) ca l mt th c hng

, to thnh t bng cch thay


mi cnh , bng hai cung c hng ngc chiu nhau: , v , .
Vi mt th c hng , , ta gi phin bn v hng (undirected
version) ca l mt th v hng

, to thnh bng cch thay mi


cung , bng cnh v hng , . Ni cch khc,

to thnh t bng
cch b i chiu ca cung.
Tnh lin thng
Mt th v hng gi l lin thng (connected) nu gia hai nh bt k ca
th c tn ti ng i. i vi th c hng, c hai khi nim lin thng tu
theo chng ta c quan tm ti hng ca cc cung hay khng. th c hng
gi l lin thng mnh (strongly connected) nu gia hai nh bt k ca th c
tn ti ng i. th c hng gi l lin thng yu (weakly connected) nu
phin bn v hng ca n l th lin thng.

131
th y
Mt th v hng c gi l y (complete) nu mi cp nh u l k
nhau, th y gm nh k hiu l

. Hnh 5-3 l v d v cc th y

.

Hnh 5-3. th y
th hai pha
Mt th v hng gi l hai pha (bipartite) nu
tp nh ca n c th chia lm hai tp ri nhau ,
sao cho khng tn ti cnh ni hai nh thuc
cng nh khng tn ti cnh ni hai nh thuc .
Nu || v || v gia mi cp nh
, trong , u c cnh ni th
th hai pha c gi l th hai pha y ,
k hiu
,
. Hnh 5-4 l v d v th hai pha
y
,
.
Hnh 5-4. th hai pha y
th phng
Mt th c gi l th phng (planar graph) nu chng ta c th v th
ra trn mt phng sao cho:
Mi nh tng ng vi mt im trn mt phng, khng c hai nh cng
to .
Mi cnh tng ng vi mt on ng lin tc ni hai nh, cc im nm
trn hai cnh bt k l khng giao nhau ngoi tr cc im u mt (tng
ng vi cc nh)
Php v th phng nh vy gi l biu din phng ca th
V d nh th y

l th phng bi n c th v ra trn mt phng nh


Hnh 5-5



132

Hnh 5-5. Hai cch v th phng ca


nh l 5-3 (nh l Kuratowski)
Mt th v hng l th phng nu v ch nu n khng cha th
con ng cu vi
,
hoc

.
nh l 5-4 (Cng thc Euler)
Nu mt th v hng lin thng l th phng v biu din phng
ca th gm nh v cnh chia mt phng thnh phn th
2.
nh l 5-5
Nu n th v hng , l th phng c t nht 3 nh th
|| 3|| 6. Ngoi ra nu khng c chu trnh di 3 th
|| 2|| 4.
nh l 5-5 ch ra rng s cnh ca n th phng l mt i lng
|| || iu ny rt hu ch i vi nhiu thut ton trn th tha (c t
cnh).
th ng
T th v hng , ta xy dng th v hng

nh sau: Mi nh ca


tng ng vi mt cnh ca , gia hai nh , ca

c cnh ni nu v ch
nu tn ti nh lin thuc vi c hai cnh , trn . th

nh vy c gi
l th ng ca th . th ng c nghin cu trong cc bi ton
kim tra tnh lin thng, tp c lp cc i, t mu cnh th, chu trnh Euler v
chu trnh Hamilton v.v
2. Biu din th
Khi lp trnh gii cc bi ton c m hnh ho bng th, vic u tin cn
lm tm cu trc d liu biu din th sao cho vic gii quyt bi ton c
thun tin nht.

133
C rt nhiu phng php biu din th, trong bi ny chng ta s kho st mt
s phng php ph bin nht. Tnh hiu qu ca tng phng php biu din s
c ch r hn trong tng thut ton c th.
2.1. Ma trn k
Vi , l mt n th c hng trong || , ta c th nh s
cc nh t 1 ti v ng nht mi nh vi s th t ca n. Bng cch nh s
nh vy, th c th biu din bng ma trn vung

. Trong :


1, nu ,
0, nu ,


Vi , gi tr ca cc phn t trn ng cho chnh ma trn :

c th t
tu theo mc ch c th, chng hn t bng 0. Ma trn xy dng nh vy
c gi l ma trn k (adjacency matrix) ca th . Vic biu din th v
hng c quy v vic biu din phin bn c hng tng ng: thay mi cnh
, bi hai cung ngc hng nhau: , v , .
i vi a th th vic biu din cng tng t trn, ch c iu nu nh ,
l cung th

l s cnh ni gia nh v nh .

Hnh 5-6. Ma trn k biu din th
Trong trng hp l n th, ta c th biu din ma trn k tng ng l
cc phn t lgic:


True, nu ,
False, nu ,


C mt cch khc biu din th v hng bng ma trn

nh sau:


deg , nu
1, nu ,
0, TH khc


Cch biu din ny c ng dng trong mt s bi ton th, gi l biu din bng ma trn
Laplace (Laplacian matrix hay Kirchhoff matrix)
1
2 3
4 5
1
2 3
4 5

0 1 1 0 0
1 0 1 1 1
1 1 0 0 1
0 1 0 0 1
0 1 1 1 0

0 1 1 0 0
0 0 1 1 1
0 0 0 0 1
0 0 0 0 1
0 0 0 0 0


134
Ma trn k c mt s tnh cht:
i vi th v hng , th ma trn k tng ng l ma trn i xng

, iu ny khng ng vi th c hng.
Nu l th v hng v l ma trn k tng ng th trn ma trn ,
tng cc s trn hng bng tng cc s trn ct v bng bc ca nh :
deg
Nu l th c hng v l ma trn k tng ng th trn ma trn ,
tng cc s trn hng bng bn bc ra ca nh : deg

, tng cc s trn
ct bng bn bc vo ca nh : deg


u im ca ma trn k:
n gin, trc quan, d ci t trn my tnh
kim tra xem hai nh , ca th c k nhau hay khng, ta ch vic
kim tra bng mt php so snh:

0
Nhc im ca ma trn k
Bt k s cnh ca th l nhiu hay t, ma trn k lun lun i hi


nh lu cc phn t ma trn, iu gy lng ph b nh.
Mt s bi ton yu cu thao tc lit k tt c cc nh k vi mt nh
cho trc. Trn ma trn k vic ny c thc hin bng cch xt tt c cc
nh v kim tra iu kin

0. Nh vy, ngay c khi nh l nh c


lp (khng k vi nh no) hoc nh treo (ch k vi 1 nh) ta cng buc
phi xt tt c cc nh v kim tra gi tr tng ng

.
2.2. Danh sch cnh

Hnh 5-7. Danh sch cnh
Vi th , c nh, cnh, ta c th lit k tt c cc cnh ca
th trong mt danh sch, mi phn t ca danh sch l mt cp , tng ng
vi mt cnh ca , trong trng hp th c hng th mi cp , tng
1
2 3
4 5
(1,2) (1,3) (2,3) (2,4) (2,5) (3,5) (4,5)
1 2 3 4 5 6 7

135
ng vi mt cung, l nh u v l nh cui ca cung. Cch biu din ny
gi l danh sch cnh (edge list).
C nhiu cch xy dng cu trc d liu biu din danh sch, nhng ph bin
nht l dng mng hoc danh sch mc ni.
u im ca danh sch cnh:
Trong trng hp th tha (c s cnh tng i nh), cch biu din bng
danh sch cnh s tit kim c khng gian lu tr, bi n ch cn
nh lu danh sch cnh.
Trong mt s trng hp, ta phi xt tt c cc cnh ca th th ci t trn
danh sch cnh lm cho vic duyt cc cnh d dng hn. (Thut ton Kruskal
chng hn)
Nhc im ca danh sch cnh:
Nhc im c bn ca danh sch cnh l khi ta cn duyt tt c cc nh k
vi nh no ca th, th chng c cch no khc l phi duyt tt c
cc cnh, lc ra nhng cnh c cha nh v xt nh cn li.
Vic kim tra hai nh , c k nhau hay khng cng bt buc phi duyt
danh sch cnh, iu kh tn thi gian trong trng hp th dy
(nhiu cnh).
2.3. Danh sch k
khc phc nhc im ca cc phng php ma trn k v danh sch cnh,
ngi ta xut phng php biu din th bng danh sch k (adjacency list).
Trong cch biu din ny, vi mi nh ca th, ta cho tng ng vi n mt
danh sch cc nh k vi .
Vi th c hng , . gm nh v gm cung. C hai cch ci
t danh sch k ph bin:
Forward Star: Vi mi nh , lu tr mt danh sch cha cc nh
ni t : : , .
Reverse Star: Vi mi nh , lu tr mt danh sch cha cc nh
ni ti : : ,
Ty theo tng bi ton, chng ta s chn cu trc Forward Star hoc Reverse Star
biu din th. C nhng bi ton yu cu phi biu din th bng c hai
cu trc Forward Star v Reverse Star.

136
Vic biu din th v hng c quy v vic biu din phin bn c hng
tng ng: thay mi cnh , bi hai cung c hng ngc nhau: , v
, .
Bt c cu trc d liu no c kh nng biu din danh sch (mng, danh sch
mc ni, cy) u c th s dng biu din danh sch k, nhng mng v
danh sch mc ni c s dng ph bin nht.
a) Biu din danh sch k bng mng
Dng mt mng 1 cha cc nh, mng c chia lm on, on th
trong mng lu danh sch cc nh k vi nh . bit mt on nm t ch
s no n ch s no, ta c mt mng 1 1 nh du v tr phn
on: s bng ch s ng lin trc on th , quy c
1 . Khi cc phn t trong on:
1 1
l cc nh k vi nh .
Nhc li rng khi s dng danh sch k biu din th v hng, ta quy n v
th c hng v s cung c nhn i (Hnh 5-8).

Hnh 5-8. Dng mng biu din danh sch k
b) Biu din danh sch k bng cc danh sch mc ni

Hnh 5-9. Biu danh sch k bi cc danh sch mc ni
1 2
3
4
5
2 3 1
1 3 2 4 5
1 2 3 5
2 5 4
2 3 5 4
1 2
3
4
5
1
2
2
3
3
1
4
3
5
4
6
5
7
1
8
2
9
5
10
2
11
5
12
2
13
3
14
4 :
1 2 3 4 5
1
0
2
2
3
6
4
9
5
11
6
14 :

137
Trong cch biu din ny, ta cho tng ng mi nh ca th vi l
cht ca mt danh sch mc ni gm cc nh k vi .
u im ca danh sch k
i vi danh sch k, vic duyt tt c cc nh k vi mt nh cho trc l
ht sc d dng, ci tn danh sch k cho thy r iu ny.
Vic duyt tt c cc cnh cng n gin v mt cnh thc ra l ni mt nh
vi mt nh khc k n.
Nhc im ca danh sch k
Danh sch k yu hn ma trn k vic kim tra , c phi l cnh hay
khng, bi trong cch biu din ny ta s phi vic phi duyt ton b danh
sch k ca hay danh sch k ca .
2.4. Danh sch lin thuc
Danh sch lin thuc (incidence lists) l mt m rng ca danh sch k. Nu nh
trong biu din danh sch k, mi nh c cho tng ng vi mt danh sch cc
nh k th trong biu din danh sch lin thuc, mi nh c cho tng ng vi
mt danh sch cc cnh lin thuc. Chnh v vy, nhng k thut ci t danh sch
k c th sa i mt cht ci t danh sch lin thuc.
c bit trong trng hp th c hng, ta c th xy dng danh sch lin
thuc t danh sch cnh tng i d dng bng cch b sung cc con tr lin kt.
Gi s th c hng , c nh v cung c biu din bi danh
sch cnh 1 . V th c hng, nu ta cho tng ng mi nh mt
danh sch cc cung i ra khi (forward star) th s c tng cng danh sch lin
thuc v mi cung ch xut hin trong ng mt danh sch lin thuc. V vy ta c
th b sung hai mng 1 v 1 trong :
l ch s cung u tin trong danh sch lin thuc ca nh . Nu
danh sch lin thuc nh l , c gn bng 0.
l ch s cung k tip cung trong danh sch lin thuc cha cung
. Trng hp l cung cui cng ca mt danh sch lin thuc,
c gn bng 0
duyt tt c nhng cung i ra khi mt nh no , ta c th thc hin d
dng bng thut ton sau:
i := head[u];
while i 0 do
begin

138
X l cung e[i];
i := link[i];
end;
2.5. Chuyn i gia cc cch biu din th
C mt s thut ton m tnh hiu qu ca n ph thuc rt nhiu vo cch thc
biu din th, do khi bt tay vo gii quyt mt bi ton th, chng ta
phi tm cu trc d liu ph hp biu din th sao cho hp l nht. Nu
th u vo c cho bi mt cch biu din bt hp l, chng ta cn chuyn i
cch biu din khc thun tin trong vic trin khai thut ton.
Ta xt bi ton chuyn i cc cch biu din n th c hng , c
nh v cnh. C th biu din th ny bi:
Ma trn k:
var
a: array[1..n, 1..n] of Boolean;
Danh sch cnh:
type
TEdge = record
x, y: Integer;
end;
var
e: array[1..m] of TEdge;
Danh sch k (forward star) (biu din bng mng):
var
adj: array[1..2 * m] of Integer;
head: array[1..n + 1] of Integer;
Danh sch lin thuc (forward star) (biu din bng cu trc lin kt)
type
TEdge = record
x, y: Integer;
end;
var
e: array[1..m] of TEdge; //Danh sch cnh
link: array[1..m] of Integer; //link[i]: ch s cnh k tip trong danh sch
lin thuc
head: array[1..n] of Integer; //head[i]: ch s cnh u
tin trong danh sch lin thuc

139
a) Chuyn i gia ma trn k v danh sch cnh
Nu th c cho bi ma trn k

trong

True,
, ta c th xy dng danh sch cnh tng ng bng cch duyt tt c cc cp
, , nu

True th a cp ny vo danh sch cnh .


k := 0;
for i := 1 to n do
for j := 1 to n do
if a[i, j] then
begin
k := k + 1;
e[k].x := i; e[k].y := j;
end;
Ngc li, nu th cho bi danh sch cnh , ta c th xy dng ma trn k
bng cch khi to cc phn t ca l False ri duyt danh sch cnh, mi khi
duyt qua cung , , ta t

True.
for i := 1 to n do
for j := 1 to n do a[i, j] := False;
for k := 1 to m do
with e[k] do
a[x, y] := True;
b) Chuyn i gia ma trn k v danh sch k
T ma trn k

, ta c th xy dng hai mng 1 v


1 1 sao cho cc phn t trong mng t ch s 1 ti
ch s 1 cha danh sch k ca nh . Hai mng ny l danh sch k
dng forward star ca th.
head[n + 1] := m;
for i := n downto 1 do
begin
head[i] := head[i + 1];
for j := n downto 1 do
if a[i, j] then
begin
adj[head[i]] := j;
head[i] := head[i] - 1;
end;
end;

140
Ngc li, chng ta c th xy dng ma trn k t danh sch k theo cch: t
cc phn t ca ma trn k bng , sau vi mi nh , duyt cc nh
thuc danh sch k ca n v t

.
for i := 1 to n do
for j := 1 to n do a[i, j] := False;
for u := 1 to n do
for k := head[u] + 1 to head[u + 1] do
a[u, adj[k]] := True;
c) Chuyn i gia danh sch cnh v danh sch k
T danh sch cnh , ta c th xy dng hai mng v tng ng vi
danh sch k dng forward star bng thut ton m phn phi.
Trc ht, ta tnh cc l bc ca nh ( ):
for u := 1 to n do head[u] := 0;
for i := 1 to m do
with e[i] do
head[x] := head[x] + 1;
Sau , ta chia mng thnh on, on th s cha cc nh k vi
nh . xc nh v tr cc on ny, ta t mi tr ti v tr cui on
th :
for u := 2 to n do
head[u] := head[u - 1] + head[u];
Tip theo l duyt li danh sch cnh, mi khi duyt ti cnh , ta a vo
mng ti v tr , a vo mng ti v tr ng thi
gim hai con tr v i 1.
for i := m downto 1 do
with e[i] do
begin
adj[head[x]] := y; head[x] := head[x] - 1;
end;
n y, chng ta c mng phn lm on, trong l v tr ng
lin trc on th . Vic cui cng l t:
head[n + 1] := m;
Vic chuyn i t danh sch k sang danh sch cnh c thc hin n gin
hn: Vi mi nh , ta xt cc nh thuc danh sch k ca n v a ,
vo danh sch cnh .

141
i := 0;
for u := 1 to n do
for k := head[u] + 1 to head[u + 1] do
begin
v := adj[k];
i := i + 1;
e[i].x := u; e[i].y := v;
end;
d) Chuyn i gia danh sch cnh v danh sch lin thuc
Bi danh sch lin thuc c c t bao gm danh sch cnh, ta ch quan tm
ti vn chuyn i t danh sch cnh thnh danh sch lin thuc.
Trc ht vi mi nh ta t 0 khi to danh sch lin thuc
ca bng .
for u := 1 to n do head[u] := 0;
Tip theo ta duyt danh sch cnh, mi khi duyt qua mt cung , ta mc ni
cung ny vo danh sch lin thuc cc cung i ra khi :
for i := m downto 1 do
with e[i] do
begin
link[i] := head[x];
head[x] := i;
end;
Vi cc bi ton m chng ta s kho st, cng c mt s thut ton khng ph
thuc nhiu v cch biu din th, trong trng hp ny ti s chn cu trc d
liu d ci t v trnh by nht vic c hiu thut ton/chng trnh c
thun tin hn.
Bi tp
5.1. Cho mt th c hng nh, cnh c biu din bng danh sch k,
trong mi nh s c cho tng ng vi mt danh sch cc nh ni
t . Cho mt nh , hy tm thut ton tnh bn bc ra v bn bc vo ca
. Xc nh phc tp tnh ton ca thut ton
5.2. th chuyn v ca th c hng , l th

,
trong :

, : ,

142
Hy tm thut ton xy dng

t trong hai trng hp: v

c
biu din bng ma trn k; v

c biu din bng danh sch k.


5.3. Cho a th v hng , c biu din bng danh sch k, hy
tm thut ton || || xy dng n th

, v biu
din bng danh sch k, bit rng th gm tt c cc nh ca th
v cc cnh song song trn c thay th bng duy nht mt cnh trong
.
5.4. Cho a th c biu din bng ma trn k

trong

l s
cnh ni t nh ti nh . Hy chng minh rng

l ma trn


trong

l s ng i t nh ti nh qua ng cnh. Gi : S
dng chng minh quy np.
5.5. Cho n th , , ta gi bnh phng ca mt th l n
th


sao cho ,

nu v ch nu tn ti mt nh sao cho ,
v , u thuc . Hy tm thut ton ||

xy dng

t
trong trng hp c v

c biu din bng ma trn k, tm thut ton


|| ||

xy dng

t trong trng hp c v

c biu
din bng danh sch k.
5.6. Xy dng cu trc d liu biu din th v hng v cc thao tc:
Lit k cc nh k vi mt nh cho trc trong thi gian ||
Kim tra hai nh c k nhau hay khng trong thi gian 1
Loi b mt cnh trong thi gian 1
5.7. Vi th , c biu din bng ma trn k, a s cc thut ton
trn th s c phc tp tnh ton ||

, tuy nhin khng phi khng


c ngoi l. Chng hn bi ton tm bn cha (universal sink) trong
th: bn cha trong th c hng l mt nh ni t tt c cc nh khc
v khng c cung i ra. Hy tm thut ton || xc nh s tn ti v
ch ra bn cha trong th c hng.
5.8. Ngi ta cn c th biu din th bng ma trn lin thuc (incidence
matrix): Vi th c hng , c nh v cung, ma trn lin
thuc

ca kch thc , trong :



143


1, nu cung th i ra khi nh
1, nu cung th i vo nh
0, nu cung th khng lin thuc vi nh


Xt

l ma trn chuyn v ca ma trn , hy cho bit ngha ca ma trn


tch


3. Cc thut ton tm kim trn th
3.1. Bi ton tm ng
Cho th , v hai nh , .
Nhc li nh ngha ng i: Mt dy cc nh:

, ,

, :


c gi l mt ng i t ti , ng i ny gm 1 nh

, ,

v
cnh

, ,

. nh c gi l nh u v nh
c gi l nh cui ca ng i. Nu tn ti mt ng i t ti , ta ni
n c v n c t : .

Hnh 5-10: th v ng i
Trn c hai th Hnh 5-10, 1,2,3,4 l ng i t nh 1 ti nh 4.
1,6,5,4 khng phi ng i v khng c cnh (cung) 6,5.
Mt bi ton quan trng trong l thuyt th l bi ton duyt tt c cc nh c
th n c t mt nh xut pht no . Vn ny a v mt bi ton lit k
m yu cu ca n l khng c b st hay lp li bt k nh no. Chnh v vy
m ta phi xy dng nhng thut ton cho php duyt mt cch h thng cc nh,
nhng thut ton nh vy gi l nhng thut ton tm kim trn th (graph
traversal). Ta quan tm n hai thut ton c bn nht: thut ton tm kim theo
chiu su v thut ton tm kim theo chiu rng.
Trong nhng chng trnh ci t di y, ta gi thit rng th c cho l
th c hng, s nh khng qu 10

, s cung khng qu 10

, cc nh c nh
1
2
6
3
4
5
1
2
6
3
4
5
G1
G2

144
s t 1 ti v ng nht vi s hiu ca chng. Khun dng Input/Output quy
nh c th nh sau:
Input
Dng 1 cha s nh , nh xut pht v nh cn n .
dng tip theo, dng th cha mt danh sch cc nh, mi nh trong
danh sch tng ng vi mt cung , ca th, ngoi ra c thm mt s 0
cui dng bo hiu kt thc.
Output
Danh sch cc nh c th n c t
ng i t ti nu c
Sample Input Sample Output
8 1 5
2 3 0
3 4 0
1 5 0
6 0
0
2 0
8 0
0
Reachable vertices from 1:
1, 2, 3, 5, 4, 6,
The path from 1 to 5:
5<-3<-2<-1


3.2. Biu din th
th c biu din bng danh sch k dng forward star, mi nh s c
cho tng ng vi mt danh sch cc nh ni t . Nu th c nh th c
tng cng danh sch k, gi l tng s phn t trn tt c cc danh sch k.
Khi ||, nh quy c, 10

.
Cu trc d liu c ci t bng mng 1 mng ny c chia lm
on lin tip, on th cha danh sch cc nh ni t . V tr ca cc on
c xc nh bi mng 0 trong l v tr cui on th ,
quy c 0 0. Nh vy cc nh ni t s nm lin tip trong mng
t ch s 1 1 ti ch s .
1
2 3
4 5
6
7
8

145
3.3. Thut ton tm kim theo chiu su
a) tng
T tng ca thut ton tm kim theo chiu su (Depth-First Search DFS) c
th trnh by nh sau: Trc ht, d nhin nh n c t , tip theo, vi mi
cung , ca th th cng s n c t . Vi mi nh th tt nhin
nhng nh ni t cng n c t iu gi cho ta vit mt th tc
quy m t vic duyt t nh bng cch thm nh v tip tc
qu trnh duyt vi l mt nh cha thm ni t .
K thut nh du c s dng trnh vic lit k lp cc nh: Khi to
True, , mi ln thm mt nh, ta nh du nh li
( False) cc bc duyt quy k tip khng duyt li nh na
lu li ng i t nh xut pht , trong th tc , trc khi gi
quy vi l mt nh cha thm ni t (cha nh du), ta lu
li vt ng i t ti bng cch t , tc l lu li
nh lin trc trong ng i t ti . Khi thut ton DFS kt thc, ng i
t ti s l:


procedure DFSVisit(uV); //Thut ton tm kim theo chiu su t nh u
begin
avail[u] := False; //avail[u] = False u thm
Output u; //Lit k u
for vV:(u, v)E do //Duyt mi nh v cha thm ni t u
if avail[v] then
begin
trace[v] := u; //Lu vt ng i, nh lin trc v trn ng i
t s ti v l u
DFSVisit(v); //Gi quy tm kim theo chiu su t nh v
end;
end;
begin //Chng trnh chnh
Input th G, nh xut pht s, nh ch t;
for vV do avail[v] := True; //nh du mi nh u cha thm
DFSVisit(s);
if avail[t] then //s i ti c t
Truy theo vt t t tm ng i t s ti t;
end.

146
b) Ci t
DFS.PAS Tm ng bng DFS
{$MODE OBJFPC}
{$M 4000000}
program DepthFirstSearch;
const
maxN = 100000;
maxM = 1000000;
var
adj: array[1..maxM] of Integer; //Cc danh sch k
head: array[0..maxN] of Integer; //Mng nh du v tr ct on trong
adj
avail: array[1..maxN] of Boolean;
trace: array[1..maxN] of Integer;
n, s, t: Integer;
procedure Enter; //Nhp d liu
var
u, v, i: Integer;
begin
ReadLn(n, s, t);
i := 0;
for u := 1 to n do
begin //c danh sch k ca u
repeat
read(v);
if v <> 0 then //Thm v vo mng adj
begin
Inc(i); adj[i] := v;
end;
until v = 0;
head[u] := i; //c ht mt dng, nh du v tr ct on th u
ReadLn;
end;
head[0] := 0; //Cm canh
end;
procedure DFSVisit(u: Integer); //Thut ton tm kim theo chiu su bt
u t u
var
i: Integer;
begin
avail[u] := False;

147
Write(u, ', '); //Lit k u
for i := head[u - 1] + 1 to head[u] do //Duyt cc nh adj[i] ni t u
if avail[adj[i]] then
begin
trace[adj[i]] := u;
DFSVisit(adj[i]);
end;
end;
procedure PrintPath; //In ng i t s ti t
begin
if avail[t] then //T s khng c ng ti t
WriteLn(' There is no path from ', s, ' to ', t)
else
begin
WriteLn('The path from ', s, ' to ', t, ':');
while t <> s do //Truy vt ngc t t v s
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
end;
end;
begin
Enter;
FillChar(avail[1], n * SizeOf(avail[1]), True);
WriteLn('Reachable vertices from ', s, ': ');
DFSVisit(s);
WriteLn;
PrintPath;
end.
C th khng cn mng nh du 1 m dng lun mng 1
nh du: Khi to cc phn t mng 1 l:

0
0,


Khi iu kin mt nh cha thm l 0, mi khi t nh
thm nh , php gn s kim lun cng vic nh du thm
0.

148
Mt vi tnh cht ca DFS
Cy DFS
Nu ta sp xp danh sch k ca mi nh theo th t tng dn th thut ton DFS
lun tr v ng i c th t t in nh nht trong s tt c cc ng i t
ti ti .
Qu trnh tm kim theo chiu su cho ta mt cy DFS gc . Quan h chacon
trn cy c nh ngha l: nu t nh ti thm nh ( gi
) th l nt cha ca nt . Hnh 5-11 l th v cy DFS tng
ng vi nh xut pht 1.

Hnh 5-11: th v cy DFS
M hnh duyt th theo DFS
Ci t trn ch l mt ng dng ca thut ton DFS lit k cc nh n c
t mt nh. Thut ton DFS dng duyt qua cc nh v cc cnh ca th
c vit theo m hnh sau:
procedure DFSVisit(uV); //Thut ton tm kim theo chiu su t nh u
begin
Time := Time + 1;
d[u] := Time;
Output u; //Lit k u
for vV:(u, v)E do //Duyt mi nh v ni t u
if d[v] = 0 then DFSVisit(v); //Nu v cha thm, gi quy tm
kim theo chiu su t nh v
Time := Time + 1;
f[u] := Time;
end;
begin //Chng trnh chnh
Input th G
1
2 3
4 5
6
7
8
1
2 3
4 5
6
7
8

149
for vV do d[v] := 0; //Mi nh u cha c duyt n
Time := 0;
for vV do
if d[v] = 0 then DFSVisit(v);
end.
Thut ton ny s thm tt c cc nh v cc cnh ca th v th t thm c
gi l th t duyt DFS. Nh v d th trong bi, th t thm DFS vi cc
nh l:
1, 2, 3, 5, 4, 6, 7, 8
Th t thm DFS vi cc cnh l:
1,2; 2,3; 3,1; 3,5; 2,4; 4,6; 6,2; 1,3; 7,8
Thi gian thc hin gii thut ca DFS c th nh gi bng s ln gi th tc
(|| ln) cng vi s ln thc hin ca vng lp for bn trong th tc
. Chnh v vy:
Nu th c biu din bng danh sch k hoc danh sch lin thuc, vng
lp for bn trong th tc (xt tng th c chng trnh) s duyt
qua tt c cc cnh ca th (mi cnh hai ln nu l th v hng, mi
cnh mt ln nu l th c hng). Trong trng hp ny, thi gian thc
hin gii thut DFS l || ||
Nu th c biu din bng ma trn k, vng lp for bn trong mi th
tc s phi duyt qua tt c cc nh 1 . Trong trng hp ny
thi gian thc hin gii thut DFS l || ||

||

.
Nu th c biu din bng danh sch cnh , vng lp for bn trong th
tc s phi duyt qua tt c danh sch cnh mi ln thc hin th
tc. Trong trng hp ny thi gian thc hin gii thut DFS l ||||.
Th t duyt n v duyt xong
Hy th tc :
Khi bt u vo th tc ta ni nh c duyt n hay c thm
(discover), c ngha l ti thi im , qu trnh tm kim theo chiu su bt
u t s xy dng nhnh cy DFS gc .
Khi chun b thot khi th tc li v , ta ni nh c duyt xong
(finish), c ngha l ti thi im , qu trnh tm kim theo chiu su t
kt thc.
Trong m hnh duyt DFS trn, chng ta s dng mt bin m xc
nh thi im duyt n

v thi im duyt xong

ca mi nh . Th t

150
duyt n v duyt xong ny c ngha rt quan trng trong nhiu thut ton c
p dng DFS, chng hn nh cc thut ton tm thnh phn lin thng mnh, thut
ton sp xp t p
nh l 5-6
Vi hai nh phn bit , :
nh c duyt n trong thi gian t

nu
v ch nu l hu du ca trn cy DFS.
nh c duyt xong trong thi gian t

nu v ch nu l hu du ca trn cy DFS.
Chng minh
Bn cht ca vic nh c duyt n (hay duyt xong) trong thi gian t


chnh l th tc c gi (hay thot) khi m th tc bt u
nhng cha kt thc, ngha l th tc c dy chuyn quy t
gi ti. iu ny ch ra rng nm trong nhnh DFS gc , hay ni cch
khc, l hu du ca .
H qu
Vi hai nh phn bit , th hai on

hoc ri
nhau hoc cha nhau. Hai on

cha nhau nu v ch
nu v c quan h tin bihu du.
Chng minh
D thy rng nu hai on

khng ri nhau th hoc

hoc

, tc l hai nh , c quan h tin bihu du, p dng nh l 5-6, ta c


PCM.
nh l 5-7
Vi hai nh phn bit m , th phi c duyt n
trc khi c duyt xong:
,

(0.1)
Chng minh
y l mt tnh cht quan trng ca thut ton DFS. Hy th tc , trc
khi thot (duyt xong ), n s qut tt c cc nh cha thm ni t v gi quy
thm nhng nh , tc l phi c duyt n trc khi c duyt xong:

.
nh l 5-8 (nh l ng i trng)
nh l hu du thc s ca nh trong mt cy DFS nu v ch nu
ti thi im

m thut ton thm ti nh , tn ti mt ng i t



151
ti m ngoi tr nh , tt c cc nh khc trn ng i u cha
c thm.
Chng minh

Nu l hu du ca , ta xt ng i t ti dc trn cc cung trn cy DFS. Tt c
cc nh nm sau trn ng i ny u l hu du ca , nn theo nh l 5-6, ta c

, tc l vo thi im

, tt c cc nh u cha c thm

Nu ti thi im

, tn ti mt ng i t ti m ngoi tr nh , tt c cc nh
khc trn ng i u cha c thm, ta s chng minh rng mi nh trn ng i ny
u l hu du ca . Tht vy, gi s phn chng rng

l nh u tin trn ng i
ny m khng phi hu du ca , tc l tn ti nh lin trc

trn ng i l hu
du ca . Theo nh l 5-7,

phi c thm trc khi duyt xong :

; li l
hu du ca nn theo nh l 5-6, ta c

, vy

. Mt khc theo gi thit


rng ti thi im

th

cha c thm, tc l

, kt hp li ta c

, vy th

l hu du ca theo nh l 5-6, tri vi gi thit phn chng.


Tn gi nh l ng i trng: white-path theorem xut pht t cch trnh by
thut ton DFS bng c ch t mu th: Ban u cc nh c t mu trng,
mi khi duyt n mt nh th nh c t mu xm v mi khi duyt xong
mt nh th nh c t mu en: nh l khi c th pht biu: iu kin
cn v nh l hu du thc s ca nh trong mt cy DFS l ti thi
im nh c t mu xm, tn ti mt ng i t ti m ngoi tr nh
, tt c cc nh khc trn ng i u c mu trng.
3.4. Thut ton tm kim theo chiu rng
a) tng
T tng ca thut ton tm kim theo chiu rng (Breadth-First Search BFS) l
lp lch duyt cc nh. Vic thm mt nh s ln lch duyt cc nh ni t n
sao cho th t duyt l u tin chiu rng (nh no gn nh xut pht hn s
c duyt trc). u tin ta thm nh . Vic thm nh s pht sinh th t
thm nhng nh

, ni t (nhng nh gn nht). Tip theo ta thm


nh

, khi thm nh

s li pht sinh yu cu thm nhng nh

, ni
t

. Nhng r rng cc nh ny xa hn nhng nh nn chng ch c


thm khi tt c nhng nh thm. Tc l th t duyt nh s l:
,

, ,

,

152

Hnh 5-12: Th t thm nh ca BFS
Thut ton tm kim theo chiu rng s dng mt danh sch cha nhng nh
ang ch thm. Ti mi bc, ta thm mt nh u danh sch, loi n ra khi
danh sch v cho nhng nh cha xp hng k vi n xp hng thm vo cui
danh sch. Thut ton s kt thc khi danh sch rng.
V nguyn tc vo trc ra trc, danh sch cha nhng nh ang ch thm c
t chc di dng hng i (Queue): Nu ta c l mt hng i vi th tc
y mt nh vo hng i v hm tr v mt nh ly ra t
hng i th m hnh ca gii thut BFS c th vit nh sau:
Queue := (s); //Khi to hng i ch gm mt nh s
for vV do
avail[v] := True;
avail[s] := False; //nh du ch c nh s c xp hng
repeat //Lp ti khi hng i rng
u := Pop; //Ly t hng i ra mt nh u
Output u; //Lit k u
for vV:avail[v] and (u, v)E do //Xt nhng nh v k u
cha c y vo hng i
begin
trace[v] := u; //Lu vt ng i
Push(v); //y v vo hng i
avail[v] := False; //nh du v xp hng
end;
until Queue = ;
if avail[t] then //s i ti c t
Truy theo vt t t tm ng i t s ti t;


Thm trc tt c cc nh
Thm sau tt c cc nh


153
b) Ci t
BFS.PAS Tm ng bng BFS
{$MODE OBJFPC}
program Breadth_First_Search;
const
maxN = 100000;
maxM = 1000000;
var
adj: array[1..maxM] of Integer; //Cc danh sch k
head: array[0..maxN] of Integer; //Mng nh du v tr ct on trong adj
avail: array[1..maxN] of Boolean;
trace: array[1..maxN] of Integer;
n, s, t: Integer;
Queue: array[1..maxN] of Integer;
front, rear: Integer;
procedure Enter; //Nhp d liu
var
u, v, i: Integer;
begin
ReadLn(n, s, t);
i := 0;
for u := 1 to n do
begin //c danh sch k ca u
repeat
read(v);
if v <> 0 then //Thm v vo mng adj
begin
Inc(i); adj[i] := v;
end;
until v = 0;
head[u] := i; //c ht mt dng, nh du v tr ct on th u
ReadLn;
end;
head[0] := 0; //Cm canh
end;
procedure BFS; //Thut ton tm kim theo chiu rng
var
u, i: Integer;
begin
front := 1; rear := 1; //front: ch s u hng i; rear: ch s cui hng i
Queue[1] := s; //Khi to hng i ban u ch c mi mt nh s

154
FillChar(avail[1], n * SizeOf(avail[1]), True); //Cc nh u
cha xp hng
avail[s] := False; //ngoi tr nh s xp hng
repeat
u := Queue[front]; Inc(front); //Ly t hng i ra mt nh u
Write(u, ', '); //Lit k u
for i := head[u - 1] + 1 to head[u] do //Duyt nhng nh adj[i]
ni t u
if avail[adj[i]] then //Nu nh cha thm
begin
Inc(rear); Queue[rear] := adj[i]; //y vo hng i
avail[adj[i]] := False;
trace[adj[i]] := u; //Lu vt ng i
end;
until front > rear;
end;
procedure PrintPath; //In ng i t s ti t
begin
if avail[t] then //T s khng c ng ti t
WriteLn(' There is no path from ', s, ' to ', t)
else
begin
WriteLn('The path from ', s, ' to ', t, ':');
while t <> s do //Truy vt ngc t t v s
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
end;
end;
begin
Enter;
WriteLn('Reachable vertices from ', s, ': ');
BFS;
WriteLn;
PrintPath;
end.
Tng t nh thut ton tm kim theo chiu su, ta c th dng mng
1 kim lun chc nng nh du.

155
c) Mt vi tnh cht ca BFS
Cy BFS
Nu ta sp xp cc danh sch k ca mi nh theo th t tng dn th thut ton
BFS lun tr v ng i qua t cnh nht trong s tt c cc ng i t ti .
Nu c nhiu ng i t ti u qua t cnh nht th thut ton BFS s tr v
ng i c th t t in nh nht trong s nhng ng i .
Qu trnh tm kim theo chiu rng cho ta mt cy BFS gc . Khi thut ton kt
thc chnh l nt cha ca nt trn cy. Hnh 5-13 l th v cy BFS
tng ng vi nh xut pht 1.

Hnh 5-13: th v cy BFS
M hnh duyt th theo BFS
Tng t nh thut ton DFS, trn thc t, thut ton BFS cng dng xc nh
mt th t trn cc nh ca th v c vit theo m hnh sau:
procedure BFSVisit(sV);
begin
Queue := (s); //Khi to hng i ch gm mt nh s
Time := Time + 1;
d[s] := Time; //Duyt n nh s
repeat //Lp ti khi hng i rng
u := Pop; //Ly t hng i ra mt nh u
Time := Time + 1;
f[u] := Time; //Ghi nhn thi im duyt xong nh u
Output u; //Lit k u
for vV:(u, v)E do //Xt nhng nh v k u
if d[v] = 0 then //Nu v cha duyt n
begin
Push(v); //y v vo hng i
1
2 3
4 5
6
7
8
1
2 3
4 5
6
7
8

156
Time := Time + 1;
d[v] := Time; //Ghi nhn thi im duyt n nh v
end;
until Queue = ;
end;
begin //Chng trnh chnh
Input th G;
for vV do d[v] := 0; //Mi nh u cha c duyt n
Time := 0;
for vV do
if avail[v] then BFSVisit(v);
end.
Thi gian thc hin gii thut ca BFS tng t nh i vi DFS, bng ||
|| nu th c biu din bng danh sch k hoc danh sch lin thuc, bng
||

nu th c biu din bng ma trn k, v bng |||| nu th


c biu din bng danh sch cnh.
Th t duyt n v duyt xong
Tng t nh thut ton DFS, i vi thut ton BFS ngi ta cng quan tm ti
th t duyt n v duyt xong: Khi mt nh c y vo hng i, ta ni nh
c duyt n (c thm) v khi mt nh c ly ra khi hng i, ta ni
nh c duyt xong. Trong m hnh ci t trn, mi nh s tng ng
vi thi im duyt n

v thi im duyt xong


V cch hot ng ca hng i: nh no duyt n trc s phi duyt xong
trc, chnh v vy, vic lit k cc nh c th thc hin khi chng c duyt
n hay duyt xong m khng nh hng ti th t. Nh cch ci t trn, mi
nh c nh du mi khi nh c duyt n v c lit k mi khi n
c duyt xong.
C th sa i mt cht m hnh ci t bng cch thay c ch nh du duyt
n/cha duyt n bng duyt xong/cha duyt xong:
Input th G;
for vV do avail[v] := True; //nh du mi nh u cha duyt xong
Queue := ;
for vV do Push(v); //Khi to hng i cha tt c cc nh
repeat //Lp ti khi hng i rng
u := Pop; //Ly t hng i ra mt nh u
if avail[u] then //Nu u cha duyt xong
begin

157
Output u; //Lit k u
avail[u] := False; //nh du u duyt xong
for vV: avail[v] and ((u, v)E) do //Xt nhng nh v k u cha
duyt xong
begin
trace[v] := u; //Lu vt ng i
Push(v); //y v vo hng i
end;
until Queue = ;
Kt qu ca hai cch ci t khng khc nhau, s khc bit ch nm lng b
nh cn s dng cho hng i : cch ci t th nht, do c ch nh
du duyt n/cha duyt n, mi nh s c a vo ng mt ln v
ly ra khi ng mt ln nn chng ta cn khng qu nh cha cc
phn t ca . cch ci t th hai, c th c nhiu hn nh ng xp
hng trong v mt nh c th c y vo ti 1 deg ln
(tnh c bc khi to hng i cha tt c cc nh), c ngha l khi t chc d
liu, chng ta phi d tr 1 deg

2 nh cho . Con
s ny i vi th c hng l nh.
R rng i vi BFS, cch ci t nh ban u s tit kim b nh hn. Nhng c
im c bit l nu thay cu trc hng i bi cu trc ngn xp trong cch ci
t th hai, ta s c th t duyt nh DFS. y chnh l phng php kh
quy ca DFS ci t thut ton trn cc ngn ng khng cho php quy.
Bi tp
5.9. Vit chng trnh ci t thut ton DFS khng quy.
5.10. Xt th c hng , , dng thut ton DFS duyt th . Cho
mt phn v d chng minh gi thuyt sau l sai: Nu t nh c ng
i ti nh v c duyt n trc , th nm trong nhnh DFS gc .
5.11. Cho th v hng , , tm thut ton || pht hin mt
chu trnh n trong .
5.12. Cho th c hng , c nh, v mi nh c gn mt
nhn l s nguyn

, tp cung ca th c nh ngha l ,

. Gi s rng thut ton DFS c s dng duyt th,


hy kho st tnh cht ca dy cc nhn nu ta xp cc nh theo th t t
nh duyt xong u tin n nh duyt xong sau cng.
5.13. M cung hnh ch nht kch thc gm cc vung n v ,
1000. Trn mi ghi mt trong ba k t:

158
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt
trong s cc chung cnh vi ang ng. Mt cch i thot khi m cung
l mt hnh trnh i qua cc an ton ra mt bin. Hy ch gip cho nh
thm him mt hnh trnh thot ra khi m cung i qua t nht.
4. Tnh lin thng ca th
4.1. nh ngha
a) Tnh lin thng trn th v hng
th v hng , c gi l lin thng (connected) nu gia mi cp
nh ca lun tn ti ng i. th ch gm mt nh duy nht cng c coi
l th lin thng.
Cho th v hng , v l mt tp con khc rng ca tp nh . Ta
ni l mt thnh phn lin thng (connected component) ca nu:
th hn ch trn tp :

l th lin thng.
Khng tn ti mt tp cha m th hn ch trn l lin thng
(tnh ti i ca ).
(Ta cng ng nht khi nim thnh phn lin thng vi thnh phn lin thng

).

Hnh 5-14: th v cc thnh phn lin thng
Mt th lin thng ch c mt thnh phn lin thng l chnh n. Mt th
khng lin thng s c nhiu hn 1 thnh phn lin thng. Hnh 5-14 l v d v
th v cc thnh phn lin thng

ca n.



159
i khi, vic xo i mt nh v tt c cc cnh lin thuc vi n s to ra mt
th con mi c nhiu thnh phn lin thng hn th ban u, cc nh nh th
gi l nh ct (cut vertices) hay nt khp (articulation nodes). Hon ton tng
t, nhng cnh m khi ta b n i s to ra mt th c nhiu thnh phn lin
thng hn so vi th ban u c gi l cnh ct (cut edges) hay cu
(bridges).

Hnh 5-15: Khp v cu
b) Tnh lin thng trn th c hng
Cho th c hng , , c hai khi nim v tnh lin thng ca th c
hng tu theo chng ta c quan tm ti hng ca cc cung khng.
gi l lin thng mnh (strongly connected) nu lun tn ti ng i (theo cc
cung nh hng) gia hai nh bt k ca th, gi l lin thng yu (weakly
connected) nu phin bn v hng ca n l th lin thng.

Hnh 5-16: Lin thng mnh v lin thng yu
4.2. Bi ton xc nh cc thnh phn lin thng
Mt bi ton quan trng trong l thuyt th l bi ton kim tra tnh lin thng
ca th v hng hay tng qut hn: Bi ton lit k cc thnh phn lin thng
ca th v hng.
lit k cc thnh phn lin thng ca th v hng , , phng
php c bn nht l bt u t mt nh bt k, ta lit k nhng nh n c t
nh vo mt thnh phn lin thng, sau loi tt c cc nh lit k ra
Lin thng Lin thng
Khp
C

160
khi th v lp li, thut ton s kt thc khi tp nh ca th tr thnh .
Vic loi b nh ca th c th thc hin bng c ch nh du nhng nh b
loi:
procedure Scan(uV)
begin
Dng BFS hoc DFS lit k v nh du nhng nh c th
n c t u;
end;
begin
for uV do
Khi to v cha b nh du;
Count := 0;
for uV do
if u cha b nh du then
begin
Count := Count + 1;
Output Thng bo thnh phn lin thng th Count
gm cc nh :;
Scan(u);
end;
end.
Thi gian thc hin gii thut ng bng thi gian thc hin gii thut duyt
th bng DFS hoc BFS.
4.3. Bao ng ca th v hng
a) nh ngha
th y vi nh, k hiu

, l mt n th v hng m gia hai nh


bt k ca n u c cnh ni. th y

c ng

cnh, bc
ca mi nh u l 1

Hnh 5-17: th y



161
b) Bao ng th
Vi th , , ngi ta xy dng th , cng gm nhng nh
ca cn cc cnh xy dng nh sau:
Gia hai nh , ca c cnh niGia hai nh , ca c ng i
th xy dng nh vy c gi l bao ng ca th .
T nh ngha ca th y , v th lin thng, ta suy ra:
Mt n th v hng l lin thng nu v ch nu bao ng ca n l
th y
Mt n th v hng c thnh phn lin thng nu v ch nu bao ng
ca n c thnh phn y .

Hnh 5-18: n th v hng v bao ng ca n
Bi vic kim tra mt n th c phi th y hay khng c th thc hin
kh d dng (m s cnh chng hn) nn ngi ta ny ra tng c th kim tra
tnh lin thng ca th thng qua vic kim tra tnh y ca bao ng. Vn
t ra l phi c thut ton xy dng bao ng ca mt th cho trc v mt
trong nhng thut ton l:
c) Thut ton Warshall
Thut ton Warshall gi theo tn ca Stephen Warshall, ngi m t thut
ton ny vo nm 1960, i khi cn c gi l thut ton Roy-Warshall v
Bernard Roy cng m t thut ton ny vo nm 1959. Thut ton c th
m t rt gn:
Gi s n th v hng , c nh nh s t 1 ti , thut ton
Warshall xt tt c cc nh , vi mi nh c xt, thut ton li xt tip
tt c cc cp nh , : nu th c cnh , v cnh , th ta t ni thm
cnh , nu n cha c. T tng ny da trn mt quan st n gin nh sau:


162
Nu t c ng i ti v t li c ng i ti th chc chn t s c
ng i ti .
Thut ton Warshall yu cu th phi c biu din bng ma trn k

, trong

True , . M hnh ci t thut ton kh n gin:


for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
a[i, j] := a[i, j] or a[i, k] and a[k, j];
Vic chng minh tnh ng n ca thut ton i hi phi lt li cc l thuyt v
bao ng bc cu v quan h lin thng, ta s khng trnh by y. Tuy thut
ton Warshall rt d ci t nhng i hi thi gian thc hin gii thut kh ln:

. Chnh v vy thut ton Warshall ch nn s dng khi thc s cn ti bao


ng ca th, cn nu ch cn lit k cc thnh phn lin thng th cc thut
ton tm kim trn th t ra hiu qu hn nhiu.
Di y, ta s th ci t thut ton Warshall tm bao ng ca n th v
hng sau m s thnh phn lin thng ca th:
Vic ci t thut ton s qua nhng bc sau:
Dng ma trn k biu din th, quy c rng

,
Dng thut ton Warshall tm bao ng, khi l ma trn k ca th bao
ng
Da vo ma trn k , nh 1 v nhng nh k vi n s thuc thnh phn
lin thng th nht; vi nh no khng k vi nh 1, th cng vi
nhng nh k n s thuc thnh phn lin thng th hai; vi nh no
khng k vi c nh 1 v nh , th cng vi nhng nh k n s thuc
thnh phn lin thng th ba v.v
Input
Dng 1: Cha s nh 200 v s cnh ca th
dng tip theo, mi dng cha mt cp s v tng ng vi mt cnh
,
Output
Lit k cc thnh phn lin thng ca th

163
Sample
Input
Sample Output

12 10
1 4
2 3
3 6
4 5
6 7
8 9
8 10
9 11
11 8
11 12
Connected Component 1: 1, 4, 5,
Connected Component 2: 2, 3, 6, 7,
Connected Component 3: 8, 9, 10,
11, 12,

WARSHALL.PAS Thut ton Warshall lit k cc thnh phn lin thng
{$MODE OBJFPC}
program WarshallAlgorithm;
const
maxN = 200;
var
a: array[1..maxN, 1..maxN] of Boolean; //Ma trn k ca th
n: Integer;
procedure Enter; //Nhp th
var
i, j, k, m: Integer;
begin
ReadLn(n, m);
for i := 1 to n do
begin
FillChar(a[i][1], n * SizeOf(a[i][1]), False);
a[i, i] := True;
end;
for k := 1 to m do
begin
ReadLn(i, j);
a[i, j] := True;
a[j, i] := True; // th v hng: (i, j) = (j, i)
end;
end;
procedure ComputeTransitiveClosure; //Thut ton Warshall
var
1
4 5
2
6 7
3
9
11 12
10
8

164
k, i, j: Integer;
begin
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
a[i, j] := a[i, j] or a[i, k] and a[k, j];
end;
procedure PrintResult;
var
Count: Integer;
avail: array[1..maxN] of Boolean; //avail[v] = True v cha c lit k
vo thnh phn lin thng no
u, v: Integer;
begin
FillChar(avail, n * SizeOf(Boolean), True); //Mi nh u cha
c lit k vo thnh phn lin thng no
Count := 0;
for u := 1 to n do
if avail[u] then //Vi mt nh u cha c lit k vo thnh phn lin thng
no
begin //Lit k thnh phn lin thng cha u
Inc(Count);
Write('Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then //Xt nhng nh v k u (trn bao ng)
begin
Write(v, ', '); //Lit k nh vo thnh phn lin thng
cha u
avail[v] := False; //Lit k nh no nh du nh
end;
WriteLn;
end;
end;
begin
Enter;
ComputeTransitiveClosure;
PrintResult;
end.
4.4. Bi ton xc nh cc thnh phn lin thng mnh
i vi th c hng, ngi ta quan tm n bi ton kim tra tnh lin thng
mnh, hay tng qut hn: Bi ton lit k cc thnh phn lin thng mnh ca

165
th c hng. Cc thut ton tm kim thnh phn lin thng mnh hiu qu hin
nay u da trn thut ton tm kim theo chiu su Depth-First Search.
Ta s kho st v ci t hai thut ton lit k thnh phn lin thng mnh vi
khun dng Input/Output nh sau:
Input
Dng u: Cha s nh 10

v s cung 10

ca th.
dng tip theo, mi dng cha hai s nguyn , tng ng vi mt cung
, ca th.
Output
Cc thnh phn lin thng mnh.
Sample
Input
Sample Output

11 15
1 2
1 8
2 3
3 4
4 2
4 5
5 6
6 7
7 5
8 9
9 4
9 10
10 8
10 11
11 8
Strongly Connected
Component 1:
7, 6, 5,
Strongly Connected
Component 2:
4, 3, 2,
Strongly Connected
Component 3:
11, 10, 9, 8,
Strongly Connected
Component 4:
1,

a) Phn tch
Xt thut ton tm kim theo chiu su:
procedure DFSVisit(uV);
begin
Thm u vo cy T
for vV:(u, v)E do
if vT then
begin
1
2
3 4
5 6
7
8 11
9 10

166
Thm v v cung (u, v) vo cy T;
DFSVisit(v);
end;
end;
begin
Input th G;
for vV do avail[v] := True;
for vV do
if avail[v] then
begin
To ra mt cy rng, gi l T
DFSVisit(v);
end;
end.
th tc thm nh quy . Th tc ny xt tt c nhng nh
ni t :

Hnh 5-19: Ba dng cung ngoi cy DFS
Nu cha c thm th i theo cung thm , tc l cho nh tr thnh
con ca nh trong cy tm kim DFS, cung , khi c gi l cung
DFS (Tree edge).
Nu thm th c ba kh nng xy ra i vi v tr ca v trong cy
tm kim DFS:
l tin bi (ancestor) ca , tc l c thm trc v th tc
do dy chuyn quy t th tc gi ti.
Cung , khi c gi l cung ngc (back edge)
1
2
3
5
4
6
7
2 l tin bi ca 4
4,2 l cung ngc
7 l hu du ca 5
5,7 l cung xui
Vi 6, 4 thuc nhnh cy DFS duyt trc
6,4 l cung cho

167
l hu du (descendant) ca , tc l c thm trc , nhng th
tc sau khi tin quy theo mt hng khc gi
ri. Nn khi dy chuyn quy li li v th tc
s thy l thm nn khng thm li na. Cung ,
khi gi l cung xui (forward edge).
thuc mt nhnh DFS duyt trc , cung , khi gi l cung
cho (cross edge)
Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton
khng ch duyt qua cc nh, n cn duyt qua tt c nhng cung na. Ngoi
nhng cung nm trn cy DFS, nhng cung cn li c th chia lm ba loi: cung
ngc, cung xui, cung cho (Hnh 5-19).
b) Cy DFS v cc thnh phn lin thng mnh
nh l 5-9
Nu v l hai nh thuc thnh phn lin thng mnh th vi mi
ng i t ti cng nh t ti . Tt c nh trung gian trn
ng i u phi thuc .
Chng minh
V v l hai nh thuc nn c mt ng i t ti v mt ng i khc t ti
. Ni tip hai ng i ny li ta s c mt chu trnh i t ti ri quay li trong
l mt nh nm trn chu trnh. iu ny ch ra rng nu i dc theo chu trnh ta c
th i t ti cng nh t ti , ngha l v thuc cng mt thnh phn lin thng
mnh.
nh l 5-10
Vi mt thnh phn lin thng mnh bt k, s tn ti duy nht mt nh
sao cho mi nh ca u thuc nhnh cy DFS gc .
Chng minh
Trong s cc nh ca , chn l nh c thm u tin theo thut ton DFS. Ta s
chng minh nm trong nhnh DFS gc . Tht vy: vi mt nh bt k ca , do
lin thng mnh nn phi tn ti mt ng i t ti :

, ,


T nh l 5-9, tt c cc nh

, ,

u thuc , li do cch chn nn chng s


phi thm sau nh . Li t nh l 5-8 (nh l ng i trng), tt c cc nh

, ,

phi l hu du ca tc l chng u thuc nhnh DFS gc .


nh trong chng minh nh l nh thm trc tt c cc nh khc trong
gi l cht ca thnh phn lin thng mnh . Mi thnh phn lin thng mnh c
duy nht mt cht. Xt v v tr trong cy DFS, cht ca mt thnh phn lin

168
thng mnh l nh nm cao nht so vi cc nh khc thuc thnh phn , hay
ni cch khc: l tin bi ca tt c cc nh thuc thnh phn .
nh l 5-11
Vi mt cht khng l tin bi ca bt k cht no khc th cc nh
thuc nhnh DFS gc chnh l thnh phn lin thng mnh cha .
Chng minh
Vi mi nh nm trong nhnh DFS gc , gi l cht ca thnh phn lin thng mnh
cha . Ta s chng minh . Tht vy, theo nh l 5-10, phi nm trong nhnh DFS
gc . Vy nm trong c nhnh DFS gc v nhnh DFS gc , ngha l v c quan
h tin bihu du. Theo gi thit khng l tin bi ca bt k cht no khc nn phi
l hu du ca . Ta c ng i , m v thuc cng mt thnh phn lin
thng mnh nn theo nh l 5-9, cng phi thuc thnh phn lin thng mnh . Mi
thnh phn lin thng mnh c duy nht mt cht m v u l cht nn .
Theo nh l 5-10, ta c thnh phn lin thng mnh cha nm trong nhnh DFS gc
, theo chng minh trn ta li c: Mi nh trong nhnh DFS gc nm trong thnh phn
lin thng mnh cha . Kt hp li c: Nhnh DFS gc chnh l thnh phn lin
thng mnh cha .
c) Thut ton Tarjan
tng

Hnh 5-20: Thut ton Tarjan b cy DFS
Thut ton Tarjan [40] c th pht biu nh sau: Chn l cht khng l tin bi
ca mt cht no khc, chn ly thnh phn lin thng mnh th nht l nhnh
DFS gc . Sau loi b nhnh DFS gc ra khi cy DFS, li tm thy mt
cht khc m nhnh DFS gc khng cha cht no khc, li chn ly thnh
1
2
3 4
5 6
7
8 11
9 10
1
2
3 4
5 6
7
8 11
9 10

169
phn lin thng mnh th hai l nhnh DFS gc Tng t nh vy cho thnh
phn lin thng mnh th ba, th t, v.v C th hnh dung thut ton Tarjan
b cy DFS ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt
thnh phn lin thng mnh.
M hnh ci t ca thut ton Tarjan:
procedure DFSVisit(uV);
begin
nh du u thm
for vV: (u, v)E do
if v cha thm then DFSVisit(v);
if u l cht then
begin
Lit k thnh phn lin thng mnh tng ng vi cht u
Loi b cc nh lit k khi th v cy DFS
end;
end;
begin
nh du mi nh u cha thm
for vV do
if v cha thm then DFSVisit(v);
end.
Trnh by di dng nh vy, nhng by gi chng ta mi tho lun ti vn
quan trng nht: Lm th no kim tra mt nh no c phi l cht hay
khng ?
nh l 5-12
Trong m hnh ci t ca thut ton Tarjan, vic kim tra nh c phi
l cht khng c thc hin khi nh c duyt xong, khi l cht
nu v ch nu trong nhnh DFS gc khng c cung ti nh thm
trc .
Chng minh
Ta nhc li cc tnh cht ca 4 loi cung:
Cung DFS v cung xui ni t nh thm trc n nh thm sau, hn na chng u
l cung ni t tin bi ti hu du
Cung ngc v cung cho ni t nh thm sau ti nh thm trc, cung ngc ni t
hu du ti tin bi cn cung cho ni hai nh khng c quan h tin bihu du.
Nu trong nhnh DFS gc khng c cung ti nh thm trc th tc l khng tn ti
cung ngc v cung cho i ra khi nhnh DFS gc . iu ch ra rng t , i theo cc
cung ca th s ch n c nhng nh nm trong ni b nhnh DFS gc m thi.
Thnh phn lin thng mnh cha phi nm trong tp cc nh c th n t , tp ny li
chnh l nhnh DFS gc , vy nn l cht.

170
Ngc li, nu t nh ca nhnh DFS gc c cung , ti nh thm trc th cung
phi l cung ngc hoc cung cho.
Nu cung , l cung ngc th l tin bi ca , m cng l tin bi ca nhng
thm sau nn l hu du ca . Ta c mt chu trnh nn c v thuc
cng mt thnh phn lin thng mnh. Xt v v tr trn cy DFS, l tin bi ca nn
khng th l cht
Nu cung , l cung cho, ta gi l cht ca thnh phn lin thng mnh cha . Ti
thi im th tc xt ti cung , , nh c duyt n nhng cha
duyt xong (do l tin bi ca ), nh cng duyt n ( c thm trc do l
cht ca thnh phn lin thng mnh cha , c thm trc theo gi thit, c thm
trc v l cht ca thnh phn lin thng mnh cha ) nhng cha duyt xong (v nu
c duyt xong th thut ton loi b tt c cc nh thuc thnh phn lin thng mnh
cht trong c nh ra khi th nn cung , s khng c tnh n na), iu
ny ch ra rng khi c gi, hai th tc v u
c gi nhng cha thot, tc l chng nm trn mt dy chuyn quy, hay v c
quan h tin bihu du. V c thm trc nn s l tin bi ca , ta c chu trnh
nn v thuc cng mt thnh phn lin thng mnh, thnh phn ny
c cht ri nn khng th l cht na.
T nh l 5-12, vic s kim tra nh c l cht hay khng c th thay bng
vic kim tra xem c tn ti cung ni t mt nh thuc nhnh DFS gc ti mt
nh thm trc hay khng?.
Di y l mt cch ci t ht sc thng minh, ni dung ca n l nh s th
t cc nh theo th t duyt n. nh ngha l s th t ca nh
theo cch nh s . Ta tnh thm l gi tr . nh nht trong
cc nh c th n c t mt nh no ca nhnh DFS gc bng mt
cung. C th cch tnh nh sau:
Trong th tc , trc ht ta nh s th t thm cho nh :
v khi to . Sau xt cc nh ni t u, c hai
kh nng:
Nu thm th ta cc tiu ho theo cng thc:

mi
min
c
,
Nu cha thm th ta gi quy , sau cc tiu ho theo
cng thc:

mi
min
c
,
Khi duyt xong mt nh (chun b thot khi th tc ), ta so snh
v , nu nh th l cht, bi khng
c cung ni t mt nh thuc nhnh DFS gc ti mt nh thm trc . Khi
ch vic lit k cc nh thuc thnh phn lin thng mnh cha chnh l
nhnh DFS gc .

171
cng vic d dng hn na, ta nh ngha mt danh sch c t chc
di dng ngn xp v dng ngn xp ny ly ra cc nh thuc mt nhnh no
. Khi duyt n mt nh , ta y ngay nh vo ngn xp, th khi duyt
xong nh , mi nh thuc nhnh DFS gc s c y vo ngn xp
ngay sau . Nu l cht, ta ch vic ly cc nh ra khi ngn xp cho ti
khi ly ti nh l s c nhnh DFS gc cng chnh l thnh phn lin
thng mnh cha .
M hnh
Di y l m hnh ci t y ca thut ton Tarjan
procedure DFSVisit(uV);
begin
Count := Count + 1;
Number[u] := Count; //nh s u theo th t duyt n
Low[u] := +;
Push(u); //y u vo ngn xp
for vV:(u, v)E do
if Number[v] > 0 then //v thm
Low[u] := min(Low[u], Number[v])
else // v cha thm
begin
DFSVisit(v); //i thm v
Low[u] := min(Low[u], Low[v]);
end;
//n y u c duyt xong
if Low[u] Number[u] then //Nu u l cht
begin
Thng bo thnh phn lin thng mnh vi cht u gm c
cc nh:;
repeat
v := Pop; //Ly t ngn xp ra mt nh v
Output v;
Xo nh v khi th: V := V - {v};
until v = u;
end;
end;
begin
Count := 0;
Stack := ; //Khi to mt ngn xp rng
for vV do Number[v] := 0; //Number[v] = 0 v cha thm

172
for vV do
if Number[v] = 0 then DFSVisit(v);
end.
Bi thut ton Tarjan ch l sa i ca thut ton DFS, cc php vo/ra ngn xp
c thc hin khng qu ln. Vy nn thi gian thc hin gii thut vn l
|| || trong trng hp th c biu din bng danh sch k hoc danh
sch lin thuc, l ||

nu dng ma trn k v l |||| nu dng danh


sch cnh.
Ci t
Chng trnh ci t di y biu din th bi danh sch lin thuc kiu
forward star: Mi nh s c cho tng ng vi mt danh sch cc cung i ra
khi , nh vy mi cung s xut hin trong ng mt danh sch lin thuc. Nu
cc cung c lu tr trong mng 1 , danh sch lin thuc c xy dng
bng hai mng.
l ch s cung u tin trong danh sch lin thuc ca nh . Nu
danh sch lin thuc nh l , c gn bng 0.
l ch s cung k tip cung trong danh sch lin thuc cha cung
. Trng hp l cung cui cng ca mt danh sch lin thuc,
c gn bng 0
TARJAN.PAS Thut ton Tarjan
{$MODE OBJFPC}
{$M 4000000}
program StronglyConnectedComponents;
const
maxN = 100000;
maxM = 1000000;
type
TStack = record
Items: array[1..maxN] of Integer;
Top: Integer;
end;
TEdge = record //Cu trc cung
x, y: Integer; //Hai nh u mt
end;
var
e: array[1..maxM] of TEdge; //Danh sch cnh
link: array[1..maxM] of Integer; //link[i]: ch s cung tip theo e[i] trong
danh sch lin thuc

173
head: array[1..maxN] of Integer; //head[u]: ch s cung u tin trong
danh sch lin thuc cc cung i ra khi u
avail: array[1..maxN] of Boolean;
Number, Low: array[1..maxN] of Integer;
Stack: TStack;
n, Count, SCC: Integer;
procedure Enter; //Nhp d liu
var
i, u, v, m: Integer;
begin
ReadLn(n, m);
for i := 1 to m do //c danh sch cnh
with e[i] do ReadLn(x, y);
FillChar(head[1], n * SizeOf(head[1]), 0); //Khi to cc danh sch
lin thuc rng
for i := m downto 1 do //Xy dng cc danh sch lin thuc
with e[i] do
begin
link[i] := head[x]; //Mc ni e[i] = (x, y) vo danh sch lin thuc
nhng cung i ra khi x
head[x] := i;
end;
end;
procedure Init; //Khi to
begin
FillChar(Number, n * SizeOf(Number[1]), 0); //Mi nh u cha
thm
FillChar(avail, n * SizeOf(avail[1]), True); //Cha nh no b
loi
Stack.Top := 0; //Ngn xp rng
Count := 0; //Bin m s th t duyt n, dng nh s
SCC := 0; //Bin nh s cc thnh phn lin thng
end;
procedure Push(v: Integer); //y mt nh v vo ngn xp
begin
with Stack do
begin
Inc(Top); Items[Top] := v;
end;
end;
function Pop: Integer; //Ly mt nh v khi ngn xp, tr v trong kt qu
hm
begin

174
with Stack do
begin
Result := Items[Top]; Dec(Top);
end;
end;
//Hm cc tiu ho: Target := Min(Target, Value)
procedure Minimize(var Target: Integer; Value: Integer);
begin
if Value < Target then Target := Value;
end;
procedure DFSVisit(u: Integer); //Thut ton tm kim theo chiu su bt
u t u
var
i, v: Integer;
begin
Inc(Count); Number[u] := Count; //Trc ht nh s cho u
Low[u] := maxN + 1; //khi to Low[u]:=+ ri sau cc tiu ho dn
Push(u); //y u vo ngn xp
i := head[u]; //Duyt t u danh sch lin thuc cc cung i ra khi u
while i <> 0 do
begin
v := e[i].y; //Xt nhng nh v ni t u
if avail[v] then //Nu v cha b loi
if Number[v] <> 0 then //Nu v thm
Minimize(Low[u], Number[v]) //cc tiu ho Low[u] theo cng thc ny
else //Nu v cha thm
begin
DFSVisit(v); //Tip tc tm kim theo chiu su bt u t v
Minimize(Low[u], Low[v]); //Ri cc tiu ho Low[u] theo cng thc ny
end;
i := link[i]; //Chuyn sang xt cung tip theo trong danh sch lin thuc
end;
//n y th nh u c duyt xong, tc l cc nh thuc nhnh DFS gc u u
thm
if Low[u] >= Number[u] then //Nu u l cht
begin //Lit k thnh phn lin thng mnh c cht u
Inc(SCC);
WriteLn('Strongly Connected Component ', SCC, ': ');
repeat
v := Pop; //Ly dn cc nh ra khi ngn xp
Write(v, ', '); //Lit k cc nh
avail[v] := False; //Ri loi lun khi th

175
until v = u; //Cho ti khi ly ti nh u
WriteLn;
end;
end;
procedure Tarjan; //Thut ton Tarjan
var
v: Integer;
begin
for v := 1 to n do
if avail[v] then DFSVisit(v);
end;
begin
Enter;
Init;
Tarjan;
end.
d) Thut ton Kosaraju-Sharir
M hnh
C mt thut ton khc lit k cc thnh phn lin thng mnh l thut ton
Kosaraju-Sharir (1981). Thut ton ny thc hin qua hai bc:
Bc 1: Dng thut ton tm kim theo chiu su vi th tc ,
nhng thm vo mt thao tc nh: nh s li cc nh theo th t duyt
xong.
Bc 2: o chiu cc cung ca th, xt ln lt cc nh theo th t t
nh duyt xong sau cng ti nh duyt xong u tin, vi mi nh , ta li
dng thut ton tm kim trn th (BFS hay DFS) lit k nhng nh no
n c t nh ang xt, chnh l mt thnh phn lin thng mnh. Lit
k xong thnh phn no, ta loi ngay cc nh ca thnh phn khi th.
nh l 5-13
Vi l nh duyt xong sau cng th l cht ca mt thnh phn lin
thng mnh khng c cung i vo.
Chng minh
D thy rng nh duyt xong sau cng phi l gc ca mt cy DFS nn s l cht ca
mt thnh phn lin thng mnh, k hiu .
Gi l cht ca mt thnh phn lin thng mnh khc. Ta chng minh rng khng
th tn ti cung i t sang , gi s phn chng rng c cung , trong
v . Khi tn ti mt ng i

: trong ni b v tn ti

176
mt ng i

: ni b . Do tnh cht ca cht, c thm trc mi nh


khc trn ng

v c thm trc mi nh khc trn ng

. Ni ng i

: vi cung , v ni tip vi ng i

: ta c mt ng i
: (Hnh 5-21)

Hnh 5-21
C hai kh nng xy ra:
Nu c thm trc th vo thi im c thm, mi nh khc trn ng i
cha thm. Theo nh l 5-8 (nh l ng i trng), s l tin bi ca v phi c
duyt xong sau . Tri vi gi thit l nh duyt xong sau cng.
Nu c thm sau , ngha l vo thi im c duyt n th cha duyt n, li
do c duyt xong sau cng nn vo thi im duyt xong th duyt xong. Theo
nh l 5-13, s l hu du ca . Vy t c ng i ti v ngc li, ngha l v
thuc cng mt thnh phn lin thng mnh. Mu thun.
nh l c chng minh.
nh l 5-13 ch ra tnh ng n ca thut ton Kosaraju-Sharir: nh duyt
xong sau cng chc chn l cht ca mt thnh phn lin thng mnh v thnh
phn lin thng mnh ny gm mi nh n c . Vic lit k cc nh thuc
thnh phn lin thng mnh cht c thc hin trong thut ton thng qua thao
tc o chiu cc cung ca th ri lit k cc nh n c t .
Loi b thnh phn lin thng mnh vi cht khi th. Cy DFS gc li
phn r thnh nhiu cy con. Lp lun tng t nh trn vi nh duyt xong sau
cng (Hnh 5-22)
V d:


u v
s r


177

Hnh 5-22. nh s li, o chiu cc cung v thc hin thut ton tm kim trn th vi
cch chn cc nh xut pht ngc li vi th t duyt xong (th t 11, 10 3, 2, 1)
Ci t
Trong vic lp trnh thut ton KosarajuSharir, vic nh s li cc nh c
thc hin bng danh sch: Ti bc duyt th ln 1, mi khi duyt xong mt
nh th nh c a vo cui danh sch. Sau khi o chiu cc cung ca
th, chng ta ch cn duyt t cui danh sch s c cc nh ng th t ngc
vi th t duyt xong (c ch tng t nh ngn xp)
lit k cc thnh phn lin thng mnh ca n th c hng bng thut
ton Tarjan cng nh thut ton Kosaraju-Sharir, cch biu din th tt nht l
s dng danh sch k hoc danh sch lin thuc. Tuy nhin vi thut ton
Kosaraju-Sharir, vic ci t bng dach sch lin thuc l hp l hn bi n cho
php chuyn t cch biu din forward star sang cch biu din reverse star mt
cch d dng bng cch chnh li mng v . Cu trc forward star c
s dng pha nh s li cc nh, cn cu trc reverse star c s dng khi lit
k cc thnh phn lin thng mnh (bi cn thc hin trn th o chiu)
KOSARAJUSHARIR.PAS Thut ton KosarajuSharir
{$MODE OBJFPC}
{$M 4000000}
program StronglyConnectedComponents;
const
maxN = 100000;
maxM = 1000000;
1
2
3 4
5 6
7
8 11
9 10
11
6
5 4
3 2
1
10 7
9 8

178
type
TEdge = record //Cu trc cung
x, y: Integer; //Hai nh u mt
end;
var
e: array[1..maxM] of TEdge; //Danh sch cnh
link: array[1..maxM] of Integer; //link[i]: Ch s cung k tip e[i] trong
danh sch lin thuc
head: array[1..maxN] of Integer; //head[u]: Ch s cung u tin trong
danh sch lin thuc
avail: array[1..maxN] of Boolean;
List: array[1..maxN] of Integer;
Top: Integer;
n, m, v, SCC: Integer;
procedure Enter; //Nhp d liu
var
i, u, v: Integer;
begin
ReadLn(n, m);
for i := 1 to m do
with e[i] do
ReadLn(x, y);
end;
procedure Numbering; //Lit k cc nh theo th t duyt xong vo danh sch List
var
i, u: Integer;
procedure DFSVisit(u: Integer); //Thut ton DFS t u
var
i, v: Integer;
begin
avail[u] := False;
i := head[u];
while i <> 0 do //Xt cc cung e[i] i ra khi u
begin
v := e[i].y;
if avail[v] then DFSVisit(v);
i := link[i];
end;
Inc(Top); List[Top] := u; //u duyt xong, a u vo cui danh sch List
end;

179
begin
//Xy dng danh sch lin thuc dng forward star: Mi nh u tng ng vi danh sch
cc cung i ra khi u
FillChar(head[1], n * SizeOf(head[1]), 0);
for i := m downto 1 do
with e[i] do
begin
link[i] := head[x];
head[x] := i;
end;
FillChar(avail[1], n * SizeOf(avail[1]), True);
Top := 0; //Khi to danh sch List rng
for u := 1 to n do
if avail[u] then DFSVisit(u);
end;
procedure KosarajuSharir;
var
i, u: Integer;
procedure Enum(u: Integer); //Thut ton DFS t u trn th o chiu
var
i, v: Integer;
begin
avail[u] := False;
Write(u, ', ');
i := head[u];
while i <> 0 do //Xt cc cung e[i] i vo u
begin
v := e[i].x;
if avail[v] then Enum(v);
i := link[i];
end;
end;
begin
//Xy dng danh sch lin thuc dng reverse star: mi nh u tng ng vi danh sch
cc cung i vo u
FillChar(head[1], n * SizeOf(head[1]), 0);
for i := m downto 1 do
with e[i] do
begin
link[i] := head[y];
head[y] := i;
end;

180
FillChar(avail[1], n * SizeOf(avail[1]), True);
SCC := 0;
for u := n downto 1 do
if avail[List[u]] then //Lit k thnh phn lin thng cht List[u]
begin
Inc(SCC);
WriteLn('Strongly Connected Component ', SCC, ': ');
Enum(List[u]);
WriteLn;
end;
end;
begin
Enter;
Numbering;
KosarajuSharir;
end.
Thi gian thc hin gii thut c th tnh bng hai lt DFS, vy nn thi gian
thc hin gii thut s l || || trong trng hp th c biu din
bng danh sch k hoc danh sch lin thuc, l ||

nu dng ma trn k v
l |||| nu dng danh sch cnh.
4.5. Sp xp t p

Hnh 5-23. th c hng v th cc thnh phn lin thng mnh
Xt th c hng , , ta xy dng th c hng

nh sau: Mi nh thuc

tng ng vi mt thnh phn lin


thng mnh ca . Mt cung ,

nu v ch nu tn ti mt cung
, trn trong ; .
{1}
{2,3,4} {8,9,10,11}
{5, 6, 7}
1
2
3 4
5 6
7
8 11
9 10

181
th

gi l th cc thnh phn lin thng mnh


th

l th c hng khng c chu trnh (directed acyclic graph-DAG)


v nu

c chu trnh, ta c th hp tt c cc thnh phn lin thng mnh


tng ng vi cc nh dc trn chu trnh c mt thnh phn lin thng
mnh ln trn th , mu thun vi tnh ti i ca mt thnh phn lin thng
mnh.
Trong thut ton Tarjan, khi mt thnh phn lin thng mnh c lit k, thnh
phn s tng ng vi mt nh khng c cung i ra trn

. Cn trong
thut ton KosarajuSharir, khi mt thnh phn lin thng mnh c lit k,
thnh phn s tng ng vi mt nh khng c cung i vo trn

. C hai
thut ton u loi b thnh phn lin thng mnh mi khi lit k xong, tc l loi
b nh tng ng trn

.
Nu ta nh s cc nh ca

t 1 tr i theo th t cc thnh phn lin thng


mnh c lit k th thut ton KosarajuSharir s cho ta mt cch nh s gi l
sp xp t p (topological sorting) trn

: Cc cung trn

khi s ch
ni t nh mang ch s nh ti nh mang ch s ln. Nu nh s cc nh ca

theo thut ton Tarjan th ngc li, cc cung trn

khi s ch ni t
nh mang ch s ln ti nh mang ch s nh.
Bi tp
5.14. Chng minh rng th c hng , l khng c chu trnh nu v
ch nu qu trnh thc hin thut ton tm kim theo chiu su trn khng
c cung ngc.
5.15. Cho th c hng khng c chu trnh , v hai nh , . Hy
tm thut ton m s ng i t ti (ch cn m s lng, khng cn
lit k cc ng).
5.16. Trn mt phng vi h to Decattes vung gc cho ng trn, mi
ng trn xc nh bi b 3 s thc , , y , l to tm v
l bn knh. Hai ng trn gi l thng nhau nu chng c im chung.
Hy chia cc ng trn thnh mt s ti thiu cc nhm sao cho hai ng
trn bt k trong mt nhm bt k c th i c sang nhau sau mt s hu
hn cc bc di chuyn gia hai ng trn thng nhau.
5.17. Cho mt li vung kch thc gm cc s nh phn 0,1
, 1000. Ta nh ngha mt hnh l mt min lin thng cc k
cnh mang s 1. Hai hnh c gi l ging nhau nu hai min lin thng
tng ng c th t chng kht ln nhau qua mt php di hnh. Hy phn

182
loi cc hnh trong li ra thnh mt s cc nhm tha mn: Mi nhm gm
cc hnh ging nhau v hai hnh bt k thuc thuc hai nhm khc nhau th
khng ging nhau:

5.18. Cho th c hng , , hy tm thut ton v vit chng trnh
chn ra mt tp t nht cc nh mi nh ca u c th n
c t t nht mt nh ca bng mt ng i trn .
5.19. Mt th c hng , gi l na lin thng (semi-connected) nu
vi mi cp nh , th hoc c ng i n , hoc c ng i
n .
a) Chng minh rng th c hng , l na lin thng nu v
ch nu trn tn ti ng i qua tt c cc nh (khng nht thit phi l
ng i n)
b) Tm thut ton v vit chng trnh kim tra tnh na lin thng ca
th.
5. Vi ng dng ca DFS v BFS
5.1. Xy dng cy khung ca th
Cy l th v hng, lin thng, khng c chu trnh n. th v hng
khng c chu trnh n gi l rng (hp ca nhiu cy). Nh vy mi thnh phn
lin thng ca rng l mt cy.
Xt th , v ,

l mt th con ca th (

),
nu l mt cy th ta gi l cy khung hay cy bao trm (spanning tree) ca
th . iu kin cn v mt th v hng c cy khung l th
phi lin thng.
D thy rng vi mt th v hng lin thng c th c nhiu cy khung
(Hnh 5-24).
1 1 1 0 1 1 0 0 1
1 0 0 0 1 0 0 1 1
1 1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0
1 0 0 1 0 0 0 0 0
0 0 1 1 0 1 0 0 0
1 0 0 0 0 1 0 0 1
1 0 1 0 0 1 1 0 1
1 1 1 1 1 0 0 1 1
1 1 1 0 2 2 0 0 2
1 0 0 0 2 0 0 2 2
1 1 0 0 0 0 0 0 0
1 0 0 3 0 0 0 0 0
1 0 0 3 0 0 0 0 0
0 0 3 3 0 3 0 0 0
1 0 0 0 0 3 0 0 3
1 0 1 0 0 3 3 0 3
1 1 1 1 1 0 0 3 3

183

Hnh 5-24: th v mt s v d cy khung
nh l 5-14 (Daisy Chain Theorem)
Gi s , l th v hng vi nh. Khi cc mnh sau
l tng ng:
1. l cy
2. khng cha chu trnh n v c 1 cnh
3. lin thng v mi cnh ca n u l cu
4.Gia hai nh bt k ca u tn ti ng mt ng i n
5. khng cha chu trnh n nhng h c thm vo mt cnh ta thu c
mt chu trnh n.
6. lin thng v c 1 cnh
Chng minh:
1 2:
T l cy, theo nh ngha khng cha chu trnh n. Ta s chng minh cy
c nh th phi c 1 cnh bng quy np theo s nh . R rng khi 1
th cy c 1 nh s cha 0 cnh. Nu 1, gi

, ,

l ng i
di nht (qua nhiu cnh nht) trong . nh

khng th k vi nh no trong
s cc nh

, ,

, bi nu c cnh

3 , ta s thit lp
c chu trnh n

, ,

. Mt khc, nh

cng khng th k vi
nh no khc ngoi cc nh trn ng i trn bi nu c cnh

th ta thit lp c ng i

, ,

di hn . Vy nh


ch c ng mt cnh ni vi

, ni cch khc,

l nh treo. Loi b

v
cnh

khi , ta c th mi cng l cy v c 1 nh, cy ny


theo gi thit quy np c 2 cnh. Vy cy c 1 cnh.


184
2 3:
Gi s c thnh phn lin thng

, ,

. V khng cha chu trnh n


nn cc thnh phn lin thng ca cng khng cha chu trnh n, tc l cc

, ,

u l cy. Gi

, ,

ln lt l s nh ca

, ,

th
cy

1 cnh, cy

1 cnh, cy

1 cnh. Cng li
ta c s cnh ca l cnh. Theo gi thit, cy c 1 cnh, suy ra
1, th ch c mt thnh phn lin thng l th lin thng.
By gi khi lin thng, kt hp vi gi thit khng c chu trnh nn nu b
i mt cnh bt k th th mi vn khng cha chu trnh. th mi ny khng
th lin thng v nu khng n s phi l mt cy v theo chng mnh trn, th
mi s c 1 cnh, tc l c cnh. Mu thun ny chng t tt c cc cnh
ca u l cu.
3 4:
Gi v l 2 nh bt k trong , v lin thng nn s c mt ng i n t
ti . Nu tn ti mt ng i n khc t ti th nu ta b i mt cnh
, nm trn ng i th nht nhng khng nm trn ng i th hai th t
vn c th n c bng cch: i t i theo chiu ti theo cc cnh thuc
ng th nht, sau i t ti theo ng th hai, ri li i t ti theo
cc cnh thuc ng i th nht. iu ny ch ra vic b i cnh , khng
nh hng ti vic c th i li c gia hai nh bt k. Mu thun vi gi thit
, l cu.
4 5:
Th nht khng cha chu trnh n v nu cha chu trnh n th chu trnh
qua t nht hai nh , . R rng dc theo cc cnh trn chu trnh th t c
hai ng i n ti . V l.
Gia hai nh , bt k ca c mt ng i n ni vi , vy khi thm
cnh , vo ng i ny th s to thnh chu trnh.
5 6:
Gi v l hai nh bt k trong , thm vo mt cnh , na th theo gi
thit s to thnh mt chu trnh cha cnh , . Loi b cnh ny i th phn cn
li ca chu trnh s l mt ng i t ti . Mi cp nh ca u c mt
ng i ni chng tc l lin thng, theo gi thit khng cha chu trnh n
nn l cy v c 1 cnh.
6 1:

185
Gi s khng l cy th c chu trnh, hu b mt cnh trn chu trnh ny th
vn lin thng, nu th mi nhn c vn c chu trnh th li hu mt cnh
trong chu trnh mi. C nh th cho ti khi ta nhn c mt th lin thng
khng c chu trnh. th ny l cy nhng li c 1 cnh (v l). Vy l
cy.
nh l 5-15
S cy khung ca th y

.
Ta s kho st hai thut ton tm cy khung trn th v hng lin
thng , .
a) Xy dng cy khung bng thut ton hp nht
Trc ht, t , ; khng cha cnh no th c th coi gm || cy
ri rc, mi cy ch c 1 nh. Sau xt ln lt cc cnh ca , nu cnh ang
xt ni hai cy khc nhau trong th thm cnh vo , ng thi hp nht hai
cy li thnh mt cy. C lm nh vy cho ti khi kt np || 1 cnh vo
th ta c l cy khung ca th. Trong vic xy dng cy khung bng
thut ton hp nht, mt cu trc d liu biu din cc tp ri nhau thng c
s dng tng tc php hp nht hai cy cng nh php kim tra hai nh c
thuc hai cy khc nhau khng.
b) Xy dng cy khung bng cc thut ton tm kim trn th.

Hnh 5-25: Cy khung DFS v cy khung BFS trn cng mt th (mi tn ch chiu i thm
cc nh)
p dng thut ton BFS hay DFS bt u t nh no , ti mi bc t nh
ti thm nh , ta thm vo thao tc ghi nhn lun cnh , vo cy khung. Do
th lin thng nn thut ton s xut pht t v ti thm tt c cc nh cn
li, mi nh ng mt ln, tc l qu trnh duyt s ghi nhn c ng || 1
cnh. Tt c nhng cnh khng to thnh chu trnh n bi thut ton khng
1
2 3
6 7 4 5
1
2 3
6 7 4 5
Cy DFS Cy BFS

186
thm li nhng nh thm. Theo mnh tng ng th hai, ta c nhng
cnh ghi nhn c to thnh mt cy khung ca th.
5.2. Tp cc chu trnh c s ca th
Xt mt th v hng lin thng , ; gi ,

l mt cy khung
ca n. Cc cnh ca cy khung c gi l cc cnh trong, cn cc cnh khc l
cc cnh ngoi cy.
Nu thm mt cnh ngoi

vo cy khung , th ta c ng mt chu
trnh n trong , k hiu chu trnh ny l

. Chu trnh

ch cha duy nht mt


cnh ngoi cy cn cc cnh cn li u l cnh trong cy
Tp cc chu trnh:


c gi l tp cc chu trnh c s ca th .
Cc tnh cht quan trng ca tp cc chu trnh c s:
Tp cc chu trnh c s l ph thuc vo cy khung, hai cy khung khc nhau
c th cho hai tp chu trnh c s khc nhau.
Cy khung ca th lin thng , lun cha || 1 cnh, cn li
|| || 1 cnh ngoi. Tng ng vi mi cnh ngoi c mt chu trnh c
s, vy s chu trnh c s ca th lin thng l || || 1.
Tp cc chu trnh c s l tp nhiu nht cc chu trnh tho mn: Mi chu
trnh c ng mt cnh ring, cnh khng nm trong bt c mt chu trnh
no khc. iu ny c th chng minh c bng cch ly trong th lin
thng mt tp gm chu trnh tho mn iu th vic loi b cnh ring
ca mt chu trnh s khng lm mt tnh lin thng ca th, ng thi
khng nh hng ti s tn ti ca cc chu trnh khc. Nh vy nu loi b
tt c cc cnh ring th th vn lin thng v cn || cnh. th lin
thng th khng th c t hn || 1 cnh nn ta c || || 1 hay
|| || 1.
Mi cnh trong mt chu trnh n bt k u phi thuc mt chu trnh c s.
Bi nu c mt cnh , khng thuc mt chu trnh c s no, th khi ta b
cnh i th vn lin thng v khng nh hng ti s tn ti ca cc
chu trnh c s. Li b tip || || 1 cnh ngoi ca cc chu trnh c s
th th vn lin thng v cn li || 2 cnh. iu ny v l.
i vi th , c thnh phn lin thng, ta c th xt cc thnh phn
lin thng v xt rng cc cy khung ca cc thnh phn . Khi c th m

187
rng khi nim tp cc chu trnh c s cho th v hng tng qut: Mi khi
thm mt cnh khng nm trong cc cy khung vo rng, ta c ng mt chu
trnh n, tp cc chu trnh n to thnh bng cch ghp cc cnh ngoi nh vy
gi l tp cc chu trnh c s ca th . S cc chu trnh c s l || || .
5.3. Bi ton nh chiu th
Bi ton t ra l cho mt th v hng lin thng , , hy thay mi
cnh ca th bng mt cung nh hng c mt th c hng lin
thng mnh. Nu c phng n nh chiu nh vy th c gi l th nh
chiu c. Bi ton nh chiu th c ng dng r nht trong s giao thng
ng b. Chng hn nh tr li cu hi: Trong mt h thng ng ph, liu c
th quy nh cc ng ph thnh ng mt chiu m vn m bo s i li
gia hai nt giao thng bt k hay khng.
C th tng qut ho bi ton nh chiu th: Vi th v hng ,
hy tm cch thay mi cnh ca th bng mt cung nh hng c th
mi c t thnh phn lin thng mnh nht. Di y ta xt mt tnh cht hu ch
ca thut ton thut ton tm kim theo chiu su gii quyt bi ton nh chiu
th
Xt m hnh duyt th bng thut ton tm kim theo chiu su, tuy nhin trong
qu trnh duyt, mi khi xt qua cnh , th ta nh chiu lun cnh thnh
cung , . Nu coi mt cnh ca th tng ng vi hai cung c hng
ngc chiu nhau th vic nh chiu cnh , thnh cung , tng ng
vi vic loi b cung , ca th. Ta c mt php nh chiu gi l php
nh chiu DFS.

Hnh 5-26. Php nh chiu DFS
Thut ton thc hin php nh chiu DFS c th vit nh sau:
1
2 3
4 5 6
9 10 7 8
1
2 3
4 5 6
9 10 7 8

188
procedure DFSVisit(u V);
begin
Thng bo thm u v nh du u thm;
for v:(u, v) E do
begin
nh chiu cnh (u, v) thnh cung (u, v) xo cung
(v, u) khi th;
if v cha thm then
DFSVisit(v);
end;
end;
begin
nh du mi nh u cha thm;
for vV do
if v cha thm then DFSVisit(v);
end;
Thut ton DFS s cho ta mt rng cc cy DFS v cc cung ngoi cy. Ta c cc
tnh cht sau:
nh l 5-16
Sau qu trnh duyt DFS v nh chiu, th s ch cn cung DFS v
cung ngc.
Chng minh
Xt mt cnh , bt k, khng gim tnh tng qut, gi s rng c duyt n trc
. Theo nh l 5-8 (nh l ng i trng), ta c l hu du ca . Nhn vo m
hnh ci t thut ton, c nhn xt rng vic nh chiu cnh , ch c th c thc
hin trong th tc hoc trong th tc .
Nu cnh , c nh chiu trc khi nh c duyt n, ngha l vic nh chiu
c thc hin trong th tc , v ngay sau khi cnh , c nh chiu
thnh cung , th nh s c thm. iu ch ra rng cung , l cung DFS.
Nu cnh , c nh chiu sau khi nh c duyt n, ngha l khi th tc
c gi th cnh , cha nh chiu. Vng lp bn trong th tc
chc chn s qut vo cnh ny v nh chiu thnh cung ngc , .
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l
cnh ngoi ca cy DFS. Chnh v vy, mi chu trnh c s ca cy DFS trong
th v hng ban u vn s l chu trnh trong th c hng to ra. y l mt
phng php hiu qu lit k cc chu trnh c s ca cy khung DFS: Va
duyt DFS va nh chiu, nu duyt phi cung ngc , th truy vt ng i
ca DFS tm ng t n , sau ni thm cung ngc , c
mt chu trnh c s.

189
nh l 5-17
iu kin cn v mt th v hng lin thng c th nh chiu
c l mi cnh ca th nm trn t nht mt chu trnh n (hay ni
cch khc mi cnh ca th u khng phi l cu).
Chng minh
Gi , l mt th v hng lin thng.
""
Nu l nh chiu c th sau khi nh hng s c th lin thng mnh . Vi
mt cnh , c nh chiu thnh cung , th s tn ti mt ng i n trong
theo cc cnh nh hng t v . ng i ni thm cung , s thnh mt chu
trnh n c hng trong . Tc l trn th ban u, cnh , nm trn mt chu trnh
n.
""
Nu mi cnh ca u nm trn mt chu trnh n, ta s chng minh rng: php nh
chiu DFS s to ra th lin thng mnh.
Ly mt cnh , ca , v , nm trong mt chu trnh n, m mi cnh ca mt
chu trnh n u phi thuc mt chu trnh c s ca cy DFS, nn s c mt chu trnh c
s cha cnh , . C th nhn thy rng chu trnh c s ca cy DFS qua php nh
chiu DFS vn l chu trnh trong nn theo cc cung nh hng ca chu trnh ta
c th i t ti v ngc li.
Ly v l hai nh bt k ca , do lin thng, tn ti mt ng i

, ,

l cnh ca nn theo chng minh trn, t

c th i n c

trn ,
: 1 , tc l t vn c th i n bng cc cung nh hng ca . Suy ra
l th lin thng mnh
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng
v mi cnh ca n nm trn t nht mt chu trnh n th php nh chiu DFS s
cho mt th lin thng mnh. Cn nu khng, th php nh chiu DFS s cho
mt th nh hng c t thnh phn lin thng mnh nht, mt cnh khng
nm trn mt chu trnh n no (cu) ca th ban u s c nh hng
thnh cung ni gia hai thnh phn lin thng mnh.
5.4. Lit k cc khp v cu ca th
Nu trong qu trnh nh chiu ta thm vo thao tc nh s cc nh theo th t
duyt n ca thut ton DFS, gi l s th t ca nh theo cch
nh s . nh ngha thm l gi tr . nh nht ca nhng
nh n c t nhnh DFS gc bng mt cung ngc. Tc l nu nhnh DFS
gc c nhiu cung ngc hng ln pha gc th ta ghi nhn li cung ngc
hng ln cao nht. Nu nhnh DFS gc khng cha cung ngc th ta cho

190
. Cch tnh cc gi tr . v . tng t nh trong
thut ton Tarjan: Trong th tc , trc ht ta nh s th t thm cho
nh () v khi to , sau xt tt c nhng nh k
, nh chiu cnh , thnh cung , . C hai kh nng xy ra:
Nu cha thm th ta gi thm , khi th tc
thot c ngha l xy dng c nhnh DFS gc nm trong nhnh DFS
gc , nhng cung ngc i t nhnh DFS gc cng l cung ngc i t
nhnh DFS gc ta cc tiu ho theo cng thc:
mi

min
c
,
Nu thm th , l mt cung ngc i t nhnh DFS gc ta cc
tiu ho theo cng thc:
mi
min
c
,

Hnh 5-27. Cch nh s v ghi nhn cung ngc ln cao nht
Hy mt cung DFS , ( l nt cha ca nt trn cy DFS)
Nu t nhnh DFS gc khng c cung no ngc ln pha trn c ngha
l t mt nh thuc nhnh DFS gc i theo cc cung nh hng ch i
c ti nhng nh ni b trong nhnh DFS gc m thi ch khng th ti
c , suy ra , l mt cu. Cng d dng chng minh c iu ngc
li. Vy , l cu nu v ch nu . Nh v d
Hnh 5-27, ta c C, F v E, H l cu.
Nu t nhnh DFS gc khng c cung no ngc ln pha trn , tc l nu
b i th t khng c cch no ln c cc tin bi ca . iu ny ch
ra rng nu khng phi l nt gc ca mt cy DFS th l khp. Cng
khng kh khn chng minh iu ngc li. Vy nu khng l gc ca
A
B C
D E F
G H I J
1
2 3
7 8 4
10 9 5 6
low=1
low=1 low=1
low=2
low=2
low=2 low=+ low=4 low=4
low=4

191
mt cy DFS th l khp nu v ch nu . Nh v d
Hnh 5-27, ta c B, C, E v F l khp.
Gc ca mt cy DFS th l khp nu v ch nu n c t hai 2 nhnh con tr
ln. Nh v d Hnh 5-27, gc A khng l khp v n ch c mt nhnh con.
n y ta c iu kin gii bi ton lit k cc khp v cu ca th:
n gin l dng php nh chiu DFS nh s cc nh theo th t thm v ghi
nhn cung ngc ln trn cao nht xut pht t mt nhnh cy DFS, sau dng
ba nhn xt k trn lit k ra tt c cc cu v khp ca th.
Input
Dng 1: Cha s nh 1000, s cnh ca th v hng .
dng tip theo, mi dng cha hai s , tng ng vi mt cnh ,
ca
Output
Cc khp v cu ca
Sample Input Sample Output

11 14
1 2
1 3
1 4
3 4
3 5
3 6
3 8
4 7
5 6
5 8
6 9
7 10
7 11
10 11
Bridges:
(1, 2)
(4, 7)
(6, 9)
Articulations:
1
3
4
6
7


V k thut ci t, ngoi cc mng c ni ti khi trnh by thut ton, c
thm mt mng 1 , trong ch ra nt cha ca nt trn
cy DFS, nu l gc ca mt cy DFS th c t bng 1. Cng
dng ca mng 1 l duyt tt c cc cung DFS v kim tra mt
nh c phi l gc ca cy DFS hay khng.
CUTVE.PAS Lit k cc khp v cu ca th
{$MODE OBJFPC}
program ArticulationsAndBridges;
1
3 4
5 6 7
8 9 10 11
2

192
const
maxN = 1000;
var
a: array[1..maxN, 1..maxN] of Boolean;
Number, Low, Parent: array[1..maxN] of Integer;
n, Count: Integer;
procedure Enter; //Nhp d liu
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
//Hm cc tiu ho: Target := min(Target, Value)
procedure Minimize(var Target: Integer; Value: Integer);
begin
if Value < Target then Target := Value;
end;
procedure DFSVisit(u: Integer); //Thut ton tm kim theo chiu su bt u
t u
var
v: Integer;
begin
Inc(Count);
Number[u] := Count; //nh s u theo th t duyt n
Low[u] := maxN + 1; //t Low[u] := +
for v := 1 to n do
if a[u, v] then //Xt cc nh v k u
begin
a[v, u] := False; //nh chiu cnh (u, v) thnh cung (u, v)
if Parent[v] = 0 then //Nu v cha thm
begin
Parent[v] := u; //cung (u, v) l cung DFS
DFSVisit(v); //i thm v
Minimize(Low[u], Low[v]); //Cc tiu ho Low[u] theo Low[v]
end

193
else
Minimize(Low[u], Number[v]); //Cc tiu ho Low[u] theo
Number[v]
end;
end;
procedure Solve;
var
u, v: Integer;
begin
Count := 0; //Khi to b m
FillChar(Parent, SizeOf(Parent), 0); //Cc nh u cha thm
for u := 1 to n do
if Parent[u] = 0 then
begin
Parent[u] := -1;
DFSVisit(u);
end;
end;
procedure PrintResult; //In kt qu
var
u, v: Integer;
nChildren: array[1..maxN] of Integer;
IsArticulation: array[1..maxN] of Boolean;
begin
WriteLn('Bridges: '); //Lit k cc cu
for v := 1 to n do
begin
u := Parent[v];
if (u <> -1) and (Low[v] >= Number[v]) then
WriteLn('(', u, ', ', v, ')');
end;
WriteLn('Articulations:'); //Lit k cc khp
FillChar(nChildren, n * SizeOf(Integer), 0);
for v := 1 to n do
begin
u := Parent[v];
if u <> -1 then Inc(nChildren[u]);
end;
//nh du cc gc cy c nhiu hn 1 nhnh con
for u := 1 to n do
IsArticulation[u] := (Parent[u] = -1) and (nChildren[u]
>= 2);

194
for v := 1 to n do
begin
u := Parent[v];
if (u <> -1) and (Parent[u] <> -1) and (Low[v] >=
Number[u]) then
IsArticulation[u] := True; //nh du cc khp khng phi gc
cy
end;
for u := 1 to n do //Lit k
if IsArticulation[u] then
WriteLn(u);
end;
begin
Enter;
Solve;
PrintResult;
end.
Trong bi ton lit k cc khp v cu ca th, ta biu din th bng ma trn
k tin li cho thao tc nh chiu. Nu th c s nh ln (khng th biu
din c bng ma trn k) v s cnh nh ( th tha), chng ta phi tm mt
cu trc d liu khc biu din th chi ph v b nh v thi gian ph
thuc ch yu vo thay v

nh ma trn k. Trong cc cu trc d liu biu


din th ph bin, ch c danh sch k v danh sch lin thuc cho php thc
hin iu ny, tuy nhin vic thc hin nh chiu cnh v hng thnh cung c
hng s tr nn kh phc tp.
Error! Reference source not found. yu cu bn sa i thut ton b i thao
tc nh chiu, t c th biu din th tha bi danh sch k m khng cn
gp kh khn trong vic nh chiu th na.
5.5. Cc thnh phn song lin thng
a) Cc khi nim v thut ton
th v hng lin thng c gi l th song lin thng nu n khng c
khp, tc l vic b i mt nh bt k ca th khng nh hng ti tnh lin
thng ca cc nh cn li. Ta quy c rng th ch gm mt nh v khng c
cnh no cng l mt th song lin thng.
Cho th v hng , , xt mt tp con . Gi l th hn
ch trn . th c gi l mt thnh phn song lin thng ca th nu
song lin thng v khng tn ti th con song lin thng no khc ca

195
nhn lm th con. Ta cng ng nht khi nim l thnh phn song lin
thng vi khi nim l thnh phn song lin thng.
Cn phn bit hai khi nim th nh chiu c (khng c cu) v th song
lin thng (khng c khp). Nu nh th khng nh chiu c th tp nh
ca c th phn hoch thnh cc tp con ri nhau th hn ch trn cc
tp con l cc th nh chiu c. Cn nu th khng phi th song
lin thng th tp cnh ca c th phn hoch thnh cc tp con ri nhau trn
mi tp con, cc cnh v cc nh u mt ca chng tr thnh mt th song
lin thng. Hai thnh phn song lin thng c th c chung mt im khp nhng
khng c cnh no chung

Hnh 5-28. th v hai thnh phn song lin thng c chung khp
Xt m hnh nh chiu th nh s nh theo th t duyt n v ghi nhn
cung ngc ln cao nht...
procedure DFSVisit(uV);
begin
Count := Count + 1;
Number[u] := Count; //nh s u theo th t duyt n
Low[u] := +;
for vV:(u, v)E do
begin
nh chiu cnh (u, v) thnh cung (u, v);
if Number[v] > 0 then //v thm
Low[u] := min(Low[u], Number[v])
else // v cha thm
begin
DFSVisit(v); //i thm v
Low[u] := min(Low[u], Low[v]); //Cc tiu ho Low[u]
end;
end;
1
2 3
5
4
6

196
end;
begin
Count := 0;
for vV do Number[v] := 0; //Number[v] = 0 v cha thm
for vV do
if Number[v] = 0 then DFSVisit(v);
end.
Trong th tc , mi khi xt cc nh k cha c thm, thut
ton s gi i thm sau cc tiu ho theo .
Ti thi im ny, nu th hoc l khp hoc l gc
ca mt cy DFS. tin, trong trng hp ny ta gi cung , l cung cht
ca thnh phn song lin thng.
Thut ton tm kim theo chiu su khng ch duyt qua cc nh m cn duyt v
nh chiu cc cung na. Ta s quan tm ti c thi im mt cnh c duyt
n, duyt xong, cng nh th t tin bihu du ca cc cung DFS: Cung DFS
, c coi l tin bi thc s ca cung DFS

, (hay cung

l hu
du thc s ca cung , ) nu cung

nm trong nhnh DFS gc . Xt


v v tr trn cy, cung

nm di cung , .
C th nhn thy rng nu , l mt cung cht tha mn: Khi
gi v qu trnh tm kim theo chiu su tip tc t khng thm
tip bt c mt cung cht no (tc l nhnh DFS gc khng cha cung cht
no) th cung , hp vi tt c cc cung hu du ca n s to thnh mt
nhnh cy m mi nh thuc nhnh cy l mt thnh phn song lin thng.
Chnh v vy thut ton lit k cc thnh phn song lin thng c t tng kh
ging vi thut ton Tarjan tm thnh phn lin thng mnh. Vic ci t thut
ton lit k cc thnh phn song lin thng chnh l s sa i i ngu ca thut
ton Tarjan: Thay khi nim cht bng cung cht v thay v dng ngn xp
cha cht v cc nh hu du ca cht lit k cc thnh phn lin thng mnh,
chng ta s dng ngn xp cha cung cht v cc hu du ca cung cht lit k
cc thnh phn song lin thng.
Vn rc ri duy nht gp phi l quy c mt nh c lp ca th cng l
mt thnh phn song lin thng. Nu thc hin thut ton trn, thnh phn song
lin thng ch gm duy nht mt nh s khng c cung cht no c v nh vy s
b st khi lit k. Ta s phi x l cc nh c lp nh trng hp ring khi lit k
cc thnh phn song lin thng ca th.
procedure DFSVisit(uV);

197
begin
Count := Count + 1;
Number[u] := Count; //nh s u theo th t duyt n
Low[u] := +;
for vV:(u, v)E do
begin
nh chiu cnh (u, v) thnh cung (u, v);
if Number[v] > 0 then //v thm
Low[u] := min(Low[u], Number[v])
else // v cha thm
begin
Push((u, v)); //y cung (u, v) vo ngn xp
DFSVisit(v); //i thm v
Low[u] := min(Low[u], Low[v]); //Cc tiu ho Low[u]
if Low[v] Number[u] then //(u, v) l cung cht
begin
Thng bo thnh phn song lin thng vi cung
cht (u, v):;
repeat
(p, q) := Pop; //Ly t ngn xp ra mt cung (p, q)
Output q; //Lit k cc nh nn ch cn xut ra mt u mt
until (p, q) = (u, v);
Output u; //Cn thiu nh u, lit k nt
end;
end;
end;
end;
begin
Count := 0;
for vV do Number[v] := 0; //Number[v] = 0 v cha thm
Stack := ;
for vV do
if Number[v] = 0 then
begin
DFSVisit(v);
if v l nh c lp then
Lit k thnh phn song lin thng ch gm mt
nh v
end;
end.

198
b) Ci t
V k thut ci t khng c g mi, c mt ch nh l chng ta ch dng ngn
xp cha cc cung DFS, v vy khng bao gi phi cha qu
1 cung
Input
Dng 1: Cha s nh 1000 v s cnh ca mt th v hng
dng tip theo, mi dng cha hai s , tng ng vi mt cnh ,
ca th.
Output
Cc thnh phn song lin thng ca th
Sample
Input
Sample Output

9 10
1 3
1 4
3 4
3 6
3 7
4 8
4 9
5 9
6 7
8 9
Biconnected
component: 1
5, 9
Biconnected
component: 2
9, 8, 4
Biconnected
component: 3
7, 6, 3
Biconnected
component: 4
4, 3, 1
Biconnected
component: 5
2

BCC.PAS Lit k cc thnh phn song lin thng
{$MODE OBJFPC}
program BiconnectedComponents;
const
maxN = 1000;
type
TStack = record
x, y: array[1..maxN - 1] of Integer;
Top: Integer;
end;
var
a: array[1..maxN, 1..maxN] of Boolean;
1
3 4 2
6 7 8 9
5

199
Number, Low: array[1..maxN] of Integer;
Stack: TStack;
BCC, PrevCount, Count, n, u: Integer;
procedure Enter; //Nhp d liu
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Push(u, v: Integer); //y mt cung (u, v) vo ngn xp
begin
with Stack do
begin
Inc(Top);
x[Top] := u;
y[Top] := v;
end;
end;
procedure Pop(var u, v: Integer); //Ly mt cung (u, v) khi ngn xp
begin
with Stack do
begin
u := x[Top];
v := y[Top];
Dec(Top);
end;
end;
//Hm cc tiu ho: Target := min(Target, Value)
procedure Minimize(var Target: Integer; Value: Integer);
begin
if Value < Target then Target := Value;
end;
procedure DFSVisit(u: Integer); //Thut ton tm kim theo chiu su
var
v, p, q: Integer;

200
begin
Inc(Count);
Number[u] := Count;
Low[u] := maxN + 1;
for v := 1 to n do
if a[u, v] then //Xt mi cnh (u, v)
begin
a[v, u] := False; //nh chiu lun
if Number[v] <> 0 then //v thm
Minimize(Low[u], Number[v])
else //v cha thm
begin
Push(u, v); //y cung DFS (u, v) vo Stack
DFSVisit(v); //Tip tc qu trnh DFS t v
Minimize(Low[u], Low[v]);
if Low[v] >= Number[u] then //Nu (u, v) l cung cht
begin //Lit k thnh phn song lin thng vi cung cht (u, v)
Inc(BCC);
WriteLn('Biconnected component: ', BCC);
repeat
Pop(p, q); //Ly mt cung DFS (p, q) khi Stack
Write(q, ', '); //Ch in ra mt u cung, trnh in lp
until (p = u) and (q = v); //n khi ly ra cung (u, v)
th dng
WriteLn(u); //In nt ra nh u
end;
end;
end;
end;
begin
Enter;
FillChar(Number, n * SizeOf(Integer), 0);
Stack.Top := 0;
Count := 0;
BCC := 0;
for u := 1 to n do
if Number[u] = 0 then
begin
PrevCount := Count;
DFSVisit(u);
if Count = PrevCount + 1 then //u l nh c lp
begin

201
Inc(BCC);
WriteLn('Biconnected component: ', BCC);
WriteLn(u);
end;
end;
end.
Bi tp
5.20. Hy sa i thut ton lit k khp v cu ca th, sa i thut ton lit
k cc thnh phn song lin thng sao cho khng cn phi thc hin vic
nh chiu th na (Bi v vic nh chiu mt th t ra kh cng knh
v khng hiu qu nu th c biu din bng danh sch k hay danh
sch cnh)
5.21. Tm thut ton m s cy khung ca th (Hai cy khung gi l khc
nhau nu chng c t nht mt cnh khc nhau)
6. th Euler v th Hamilton
6.1. th Euler
a) Bi ton
Bi ton v th Euler c coi l bi ton u tin ca l thuyt th. Bi ton
ny xut pht t mt bi ton ni ting: Bi ton by cy cu Knigsberg:
Thnh ph Knigsberg thuc c (nay l Kaliningrad thuc Cng ho Nga), c
chia lm 4 vng bng cc nhnh sng Pregel. Cc vng ny gm 2 vng bn b
sng (B, C), o Kneiphof (A) v mt min nm gia hai nhnh sng Pregel (D).
Vo th k XVIII, ngi ta xy 7 chic cu ni nhng vng ny vi nhau.
Ngi dn y t hi: Liu c cch no xut pht ti mt a im trong thnh
ph, i qua 7 chic cu, mi chic ng 1 ln ri quay tr v ni xut pht khng
?
Nh ton hc Thy s Leonhard Euler gii bi ton ny v c th coi y l ng
dng u tin ca L thuyt th, ng m hnh ho s 7 ci cu bng mt
a th, bn vng c biu din bng 4 nh, cc cu l cc cnh. Bi ton tm
ng qua 7 cu, mi cu ng mt ln c th tng qut ho bng bi ton: C
tn ti chu trnh trong a th i qua tt c cc cnh v mi cnh ng mt ln.

202

Hnh 5-29: M hnh th ca bi ton by ci cu
Chu trnh qua tt c cc cnh ca th, mi cnh ng mt ln c gi l chu
trnh Euler (Euler circuit/Euler circle/Euler tour). ng i qua tt c cc cnh
ca th, mi cnh ng mt ln gi l ng i Euler (Euler path/Euler
trail/Euler walk). Mt th c chu trnh Euler c gi l th Euler (Eulerian
graph/unicursal graph). Mt th c ng i Euler c gi l th na
Euler (Semi-Eulerian graph/Traversable graph).
b) Cc nh l v thut ton
nh l 5-18 (Euler)
Mt th v hng lin thng , c chu trnh Euler khi v ch
khi mi nh ca n u c bc chn.
Chng minh
Nu c chu trnh Euler th khi i dc chu trnh , mi khi i qua mt nh th bc ca
nh tng ln 2 (mt ln vo + mt ln ra). Chu trnh Euler li i qua tt c cc cnh nn
suy ra mi nh ca th u c bc chn.
Ngc li nu lin thng v mi nh u c bc chn, ta s ch ra thut ton xy dng
chu trnh Euler trn .
Xut pht t mt nh bt k, ta i sang mt nh ty k n, i qua cnh no xo lun
cnh cho ti khi khng i c na, c th nhn thy rng sau mi bc i, ch c nh
u v nh cui ca ng i c bc l cn mi nh khc trong th u c bc chn.
Cnh cui cng i qua chc chn l i ti mt nh bc l, v nu l cnh i ti mt nh
bc chn th nh ny s c t nht 2 cnh lin thuc, v nh vy khi i ti nh ny v xo
cnh vo ta vn cn mt cnh ra, qu trnh i cha kt thc. iu ny ch ra rng cnh
cui cng bt buc phi i v ni xut pht tc l chng ta c mt chu trnh . Cng d
dng nhn thy rng khi qu trnh ny kt thc, mi nh ca vn c bc chn.
Nu cn li cnh lin thuc vi mt nh no trn th li bt u t , ta i mt
cch ty theo cc cnh cn li ca ta s c mt chu trnh bt u t v kt thc
A
B
C
D
A
B
C
D

203
ti . Thay th mt bc i qua nh trn bng c chu trnh , ta s c mt chu
trnh mi ln hn. Quy trnh c lp li cho ti khi khng cn nh no c cnh lin
thuc nm ngoi . Do tnh lin thng ca , iu ny c ngha l cha tt c cc cnh
ca hay l chu trnh Euler trn th ban u.
H qu
Mt th v hng lin thng , c ng i Euler khi v ch
khi n c ng 2 nh bc l.
Chng minh
Nu c ng i Euler th ch c nh bt u v nh kt thc ng i c bc l cn
mi nh khc u c bc chn. Ngc li nu th lin thng c ng 2 nh bc l th ta
thm vo mt cnh gi ni hai nh bc l v tm chu trnh Euler. Loi b cnh gi khi
chu trnh, chng ta s c ng i Euler.
nh l 5-19
Mt thi c hng lin thng yu , c chu trnh Euler th mi
nh ca n c bn bc ra bng bn bc vo:

,
; Ngc li, nu lin thng yu v mi nh ca n c bn bc ra
bng bn bc vo, th c chu trnh Euler (suy ra s l lin thng
mnh).
Chng minh
Tng t nh php chng minh nh l 5.18.
H qu
Mt th c hng lin thng yu , c ng i Euler nhng
khng c chu trnh Euler nu tn ti ng hai nh s, sao cho:

1
cn tt c nhng nh cn li ca th u c bn bc ra bng bn bc
vo.
Vic chng minh nh l 5-18 (Euler) cho ta mt thut ton hu hiu ch ra chu
trnh Euler trn th Euler. Thut ton ny hot ng da trn mt ngn xp
v c m t c th nh sau: Bt u t nh 1, ta i thoi mi theo cc
cnh ca th cho ti khi khng i c na, i ti nh no ta y nh vo
ngn xp v i qua cnh no th ta xo cnh khi th. Khi khng i c
na th ngn xp s cha cc nh trn mt chu trnh bt u v kt thc nh
1. Sau chng ta ly ln lt cc nh ra khi ngn xp tng ng vi vic i
ngc chu trnh . Nu nh c ly ra () khng c cnh no cn li lin thuc
vi n th s c ghi ra chu trnh Euler, ngc li, nu vn cn c cnh lin
thuc th ta li i tip t theo cch trn v y thm vo ngn xp mt chu trnh

204
bt u v kt thc ti , khi ly cc nh ra khi ngn xp s tng ng
vi vic i ngc li chu trnh ri tip tc i ngc phn cn li ca chu trnh
trong ngn xpC th hnh dung l thut ton ln ngc chu trnh , khi n
nh th thay bng c mt chu trnh
Khi ci t thut ton, chng ta cn trang b ba php ton trn ngn xp :
: y mt nh vo
: Ly ra mt nh khi
: c phn t nh
Stack := (1); //Ngn xp ban u ch cha mt nh bt k,
chng hn nh 1
repeat
u := Get; //c phn t nh ngn xp
if (u, v) E then //T u cn i tip c
begin
Push(v);
E := E {(u, v)}; //Xo cnh (u, v) khi th
end;
else //T u khng i u c na
begin
u := Pop; //Ly u khi ngn xp
Output u; //In ra u
end;
until Stack = ; //Lp ti khi ngn xp rng
c) Ci t
Di y chng ta s ci t thut ton tm chu trnh Euler trn a th Euler v
hng , . D liu vo lun m bo th lin thng, c t nht mt
nh v mi nh u c bc chn.
Input
Dng 1 cha s nh 10

v s cnh 10


dng tip, mi dng cha s hiu hai u mt ca mt cnh.
Output
Chu trnh Euler

205
Sample Input Sample Output
5 9
1 2
1 3
2 3
2 4
2 5
3 4
3 5
4 5
4 5
1 2 4 5 4 3 5 2 3 1

Ngoi cc thao tc i vi ngn xp, thut ton tm chu trnh Euler cn yu cu
ci t hai thao tc sau y mt cch hiu qu:
Vi mi nh kim tra xem c tn ti cnh lin thuc vi n hay khng, nu
c th ch ra mt cnh lin thuc.
Loi b mt cnh khi th
Cc cnh ca th c nh s t 1 ti , sau mi cnh v hng , s
c thay th bi hai cung c hng ngc chiu: , v , . Mi cung l
mt bn ghi gm hai nh u mt v ch s cnh v hng tng ng.
const
maxM = 1000000;
type
TArc = record
x, y: Integer; //cung (x, y)
edge: Integer; //ch s cnh v hng tng ng
end;
var
a: array[1..2 * maxM] of TArc;
Danh sch lin thuc c xy dng theo kiu reverse star: Mi nh cho tng
ng vi mt danh sch cc cung i vo . Cc danh sch ny c cho bi hai
mng 1 v 1 2 trong :
l ch s cung u tin trong danh sch lin thuc cc cung i vo ,
trng hp nh khng cn cung i vo, c gn bng 0.
l ch s cung k tip cung

trong cng danh sch lin thuc cha


cung

, trng hp

l cung cui cng trong mt danh sch lin thuc,


c gn bng 0.
1
2 3
4 5
1 2
3
4
5 6
7
8
9

206
thc hin thao tc xo cnh, ta duy tr mt mng nh du 1
trong True nu cnh v hng th b xo. Mi khi cnh v
hng b xo, c hai cung c hng tng ng u khng cn tn ti, vic kim
tra mt cung c hng

cn tn ti hay khng c th thc hin bng vic kim


tra:

.
?
False.
Chng ta s ci t cc thao tc sau trn cu trc d liu:
Hm : Tr v phn t nm nh ngn xp.
Hm Pop: Tr v phn t nm nh ngn xp v rt phn t khi ngn
xp.
Th tc Pushv: y mt nh vo ngn xp.
Tt c cc thao tc trn trn ngn xp c th ci t thc hin trong thi gian
1. Thut ton tm chu trnh Euler c th vit c th hn:
Stack := (1); //Khi to ngn xp ch cha mt nh
repeat
u := Get; //c nh u t ngn xp
i := head[u]; //Xt cung a[i] ng u danh sch lin thuc
cc cung i vo u
while (i > 0) and (deleted[a[i].edge]) do //cung a[i] ng
vi cnh v hng xo
i := link[i]; //Dch sang cung k tip
head[u] := i; //Nhng cung duyt qua b loi ngay, cp
nht li ch s u danh sch lin thuc
if i > 0 then //u cn cung i vo ng vi cnh v hng
cha xo
begin
Push(a[i].x); //y nh ni ti u vo ngn xp (i
ngc cung a[i])
Deleted[a[i].edge] := True; //Xo ngay cnh v hng
ng vi cung a[i]
end
else
Output Pop;
until Top = 0; //Lp ti khi ngn xp rng
Xt vng lp repeatuntil, mi bc lp c mt thao tc hoc c
thc hin. Mi ln thao tc c thc hin phi c mt cnh v hng b
xo v ngn xp c thm mt nh. Mi ln thao tc c thc hin th ngn
xp b bt i mt nh. V thut ton in ra 1 nh trn chu trnh Euler nn s
phi c tng cng 1 thao tc . Trc khi vo vng lp ngn xp c mt

207
nh v khi vng lp kt thc ngn xp tr thnh rng, suy ra s thao tc
phi l . T , vng lp repeatuntil thc hin 2 1 ln.
Tip theo ta nh gi s thao tc duyt danh sch lin thuc ca nh . Bi sau
vng lp while c lnh cp nht nn c th thy rng lnh gn
c thc hin bao nhiu ln th danh sch lin thuc ca b gim
i ng chng cung. Tng s phn t ca cc danh sch lin thuc l 2 v
khi thut ton kt thc, cc danh sch lin thuc u rng. Suy ra tng thi gian
thc hin php duyt danh sch lin thuc (vng lp while) trong ton b thut
ton l .
Suy ra thi gian thc hin gii thut l .
EULER.PAS Tm chu trnh Euler trong a th Euler v hng
{$MODE OBJFPC}
program EulerTour;
const
maxN = 100000;
maxM = 1000000;
type
TArc = record //Cu trc mt cung
x, y: Integer; //nh u v nh cui
edge: Integer; //Ch s cnh v hng tng ng
end;
var
n, m: Integer;
a: array[1..2 * maxM] of TArc; //Danh sch cc cung
link: array[1..2 * maxM] of Integer; //link[i]: Ch s cung k tip a[i]
trong cng danh sch lin thuc
head: array[1..maxN] of Integer; //head[u]: ch s cung u tin trong
danh sch cc cung i vo u
deleted: array[1..maxM] of Boolean; //nh du cnh v hng b xo
hay cha
Stack: array[1..maxM + 1] of Integer; //Ngn xp
Top: Integer; //Phn t nh ngn xp
procedure Enter; //Nhp d liu v xy dng danh sch lin thuc
var
i, j, u, v: Integer;
begin
ReadLn(n, m);
j := 2 * m;
for i := 1 to m do

208
begin
ReadLn(u, v); //c mt cnh v hng, thm 2 cung c hng tng ng
a[i].x := u; a[i].y := v; a[i].edge := i;
a[j].x := v; a[j].y := u; a[j].edge := i;
Dec(j);
end;
FillChar(head[1], n * SizeOf(head[1]), 0); //Khi to cc danh
sch lin thuc rng
for i := 2 * m downto 1 do
with a[i] do //Duyt tng cung (x, y)
begin //a cung vo danh sch lin thuc cc cung i vo y
link[i] := head[y];
head[y] := i;
end;
FillChar(deleted[1], n * SizeOf(deleted[1]), False); //Cc
cnh v hng u cha xo
end;
procedure FindEulerTour;
var
u, i: Integer;
begin
Top := 1; Stack[1] := 1; //Khi to ngn xp cha nh 1
repeat
u := Stack[Top]; //c phn t nh ngn xp
i := head[u]; //Cung a[i] ang ng u danh sch lin thuc
while (i > 0) and (deleted[a[i].edge]) do
i := link[i]; //Dch ch s i dc danh sch lin thuc tm cung ng vi
cnh v hng cha xo
head[u] := i; //Cp nht li head[u], "nhy" qua cc cung ng vi cnh v
hng xo
if i > 0 then //u cn cung i vo ng vi cnh v hng cha xo
begin
Inc(Top); Stack[Top] := a[i].x; //i ngc cung a[i], y nh
ni ti u vo ngn xp
Deleted[a[i].edge] := True; //Xo cnh v hng tng ng vi a[i]
end
else //u khng cn cung i vo
begin
Write(u, ' '); //In ra u trn chu trnh Euler
Dec(Top); //Ly u khi ngn xp
end;
until Top = 0; //Lp ti khi ngn xp rng
WriteLn;

209
end;
begin
Enter;
FindEulerTour;
end.
d) Vi nhn xt
Bng vic quan st hot ng ca ngn xp, chng ta c th sa m hnh ci t
ca thut ton nhm tn dng chnh ngn xp ca chng trnh con quy ch
khng cn ci t cu trc d liu ngn xp cha cc nh:
procedure Visit(u: Integer);
var
i: Integer;
begin
i := head[u];
while i 0 do
begin //Xt cung a[i] i vo u
if not deleted[a[i].edge] then //Cnh v hng tng ng cha b xo
begin
deleted[a[i].edge] := True; //Xo cnh v hng tng ng
Visit(a[i].x); //i ngc chiu cung a[i] thm nh ni ti u
end;
end;
Output u; //T u khng th i ngc chiu cung no na, in ra u trn chu trnh Euler
end;
begin
Nhp th v xy dng danh sch lin thuc;
Visit(1); //Khi ng thut ton tm chu trnh Euler
end.
Cch ci t ny kh n gin v thao tc trn ngn xp c thc hin t nhin
qua c ch gi v thot th tc quy. Tuy nhin cn ch rng su ca dy
chuyn quy c th ln ti 1 cp nn vi mt s cng c lp trnh cn t
li dung lng b nh Stack
1
.
Chng ta c th lin h thut ton ny vi thut ton tm kim theo chiu su: T
m hnh DFS, nu thay v i thm nh chng ta i thm cnh (mt cnh c th i
tip sang cnh chung u mt vi n). ng thi ta nh du cnh qua/cha

1
Trong Free Pascal 32 bit, dung lng b nh Stack dnh cho bin a phng v tham s chng trnh con
mc nh l 64 KiB. C th t li bng dn hng bin dch {$M}

210
qua thay cho c ch nh du mt nh thm/cha thm. Khi th t duyt
xong (finish) ca cc cnh cho ta mt chu trnh Euler.
Thut ton khng c g sai nu ta xy dng danh sch lin thuc kiu forward star
thay v kiu reverse star. Tuy nhin ta chn kiu reverse star bi cch biu din
ny thch hp tm chu trnh Euler trn c th v hng v c hng.
Ngi ta cn c thut ton Fleury (1883) tm chu trnh Euler bng tay: Bt u
t mt nh, chng ta i thoi mi theo cc cnh theo nguyn tc: xo b cc cnh
i qua v ch i qua cu khi khng cn cch no khc chn. Khi khng th i
tip c na th ng i tm c chnh l chu trnh Euler.
Bng cch lm dng thut ng, ta c th m t c thut ton tm Fleury cho
c th Euler c hng cng nh v hng:
Di y nu ta ni cnh , th hiu l cnh , trn th v hng,
hiu l cung , trn th c hng.
Ta gi cnh , l mt i khng tr li nu nh t i ti , sau xo
cnh ny i th khng c cch no t quay li .
Thut ton Fleury tm chu trnh Euler: Xut pht t mt nh, ta i mt cch tu
theo cc cnh tun theo hai nguyn tc: Xo b cnh va i qua v ch chn cnh
mt i khng tr li nu nh khng cn cnh no khc chn.
Thut ton Fleury l mt thut ton thch hp cho vic tm chu trnh Euler bng
tay (vi nhng th v ra c trn mt phng th vic kim tra cu bng mt
thng l tng i d dng). Tuy vy khi ci t thut ton trn my tnh th
thut ton ny t ra khng hiu qu.
6.2. th Hamilton
a) Bi ton
Khi nim v ng i v chu trnh Hamilton c a ra bi William Rowan
Hamilton (1856) khi ng thit k mt tr chi trn khi a din 20 nh, 30 cnh,
12 mt, mi mt l mt ng gic u v ngi chi cn chn cc cnh thnh
lp mt ng i qua 5 nh cho trc (Hnh 5-30).
th , c gi l th Hamilton (Hamiltonian graph) nu tn ti
chu trnh n i qua tt c cc nh. Chu trnh n i qua tt c cc nh c gi
l chu trnh Hamilton (Hamiltonian Circuit/Hamiltonian Circle). thun tin,
ngi ta quy c rng th ch gm 1 nh l th Hamilton, nhng th gm
2 nh lin thng khng phi l th Hamilton.

211

Hnh 5-30
th , c gi l th na Hamilton (traceable graph) nu tn ti
ng i n qua tt c cc nh. ng i n i qua tt c cc nh c gi l
ng i Hamilton (Hamiltonian Path).

Hnh 5-31
Trong Hnh 5-31, th

c chu trnh Hamilton , , , , , .

khng c
chu trnh Hamilton nhng c ng i Hamilton , , , .

khng c c chu
trnh Hamilton ln ng i Hamilton.
b) Cc nh l lin quan
T nh ngha ta suy ra c th ng ca th Euler l mt th
Hamilton. Ngoi ra nhng nh l sau y cho chng ta vi cch nhn bit th
Hamilton.
nh l 5-20
th v hng G, trong tn ti nh sao cho nu xo i nh ny
cng vi nhng cnh lin thuc ca chng th th nhn c s c
nhiu hn thnh phn lin thng th khng nh l G khng phi th
Hamilton
a
b
e
c
d
a b
c d
b c
d e
a
f



212
nh l 5-21 (nh l Dirak, 1952)
Xt n th v hng , c 3 nh. Nu mi nh u c
bc khng nh hn /2 th l th Hamilton.
nh l 5-22 (nh l Ghouila-Houiri, 1960)
Xt n th c hng lin thng mnh , c nh. Nu trn
phin bn v hng ca , mi nh u c bc khng nh hn th l
th Hamilton.
nh l 5-23 (nh l Ore, 1960)
Xt n th v hng , c 3 nh. Vi mi cp nh
khng k nhau c tng bc th l th Hamilton.
nh l 5-24 (nh l Meynie, 1973)
Xt n th c hng lin thng mnh , c nh. Nu trn
phin bn v hng ca , vi mi cp nh khng k nhau c tng bc
2 1 th l th Hamilton.
nh l 5-25 (nh l Bondy-Chvtal, 1972)
Xt th v hng , c nh, vi mi cp nh khng k
nhau , m ta thm mt cnh ni v , c lm
nh vy cho ti khi khng thm c cnh no na ta thu c th mi
k hiu . Khi l th Hamilton nu v ch nu l th
Hamilton.
Nu th tha mn iu kin ca nh l 5-21 hoc nh l 5-23th l
th y , khi chc chn c chu trnh Hamilton. Nh vy nh l
Bondy-Chvtal l m rng ca nh l Dirak v nh l Ore.
c) Ci t
Mc d chu trnh Hamilton v chu trnh Euler c tnh i ngu, ngi ta vn cha
tm ra phng php vi phc tp a thc tm chu trnh Hamilton cng nh
ng i Hamilton trong trng hp th tng qut. Tt c cc thut ton tm
chu trnh Hamilton hin nay u da trn m hnh duyt, c th kt hp vi mt
s mo ci t (heuristics).
Chng ta s lp trnh tm mt chu trnh Hamilton (nu c) trn mt n th v
hng vi khun dng Input/Output nh sau:
Input
Dng 1 cha s nh v s cnh ca n th (2 1000)

213
dng tip theo, mi dng cha hai s , tng ng vi mt cnh ,
ca th
Output
Mt chu trnh Hamilton nu c
Sample Input Sample Output
5 8
1 2
1 3
1 4
2 3
2 4
3 4
3 5
4 5
1 2 3 5 4 1

Tm chu trnh Hamilton trn th v hng
{$MODE OBJFPC}
program HamiltonCycle;
const
maxN = 1000;
var
a: array[1..maxN, 1..maxN] of Boolean; //Ma trn k
avail: array[2..maxN] of Boolean;
x: array[1..maxN] of Integer;
Found: Boolean;
n: Integer;
procedure Enter; //Nhp d liu v khi to
var
m, i, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
Read(u, v);
a[u, v] := True;
a[v, u] := True;
end;
FillChar(avail, SizeOf(avail), True); //Mi nh 2...n u cha i
qua
Found := False; //Found = False: Cha tm ra nghim
1 3
4 2
5

214
x[1] := 1;
end;
procedure Attempt(i: Integer); //Thut ton quay lui
var
v: Integer;
begin
for v := 2 to n do
if avail[v] and a[x[i - 1], v] then //Xt cc nh v cha i qua k
vi x[i - 1]
begin
x[i] := v; //Th i sang v
if i = n then //Nu qua n nh, n nh th n
begin
if a[v, 1] then Found := True; //nh th n quay v c
1 th tm ra nghim
Exit; //Thot lun
end
else //Qua cha n nh
begin
avail[v] := False; //nh du nh qua
Attempt(i + 1); //i tip
if Found then Exit; //Nu tm ra nghim th thot ngay
avail[v] := True;
end;
end;
end;
procedure PrintResult; //In kt qu
var
i: Integer;
begin
if not Found then
WriteLn('There is no Hamilton cycle')
else
begin
for i := 1 to n do
Write(x[i], ' ');
WriteLn(1);
end;
end;
begin
Enter;

215
Attempt(2);
PrintResult;
end.
6.3. Hai bi ton ni ting
a) Bi ton ngi a th Trung Hoa
Bi ton ngi a th Trung Hoa (Chinese Postman) c pht biu u tin
di dng tm hnh trnh ti u cho ngi a th: Anh ta phi i qua tt c cc
qung ng chuyn pht th tn v mong mun tm hnh trnh ngn nht i
ht cc qung ng trong khu vc m anh ta ph trch. Chng ta c th pht biu
trn m hnh th nh sau:
Bi ton: Cho th , , mi cnh c di (trng s) . Hy
tm mt chu trnh i qua tt c cc cnh, mi cnh t nht mt ln sao cho tng
di cc cnh i qua l nh nht.
D nhin nu l th Euler th li gii chnh l chu trnh Euler, nhng nu
khng phi th Euler th sao?. Ngi ta c thut ton vi phc tp a
thc gii bi ton ngi a th Trung Hoa nu l th v hng hoc c
hng. Mt trong nhng thut ton l kt hp thut ton tm chu trnh Euler
vi mt thut ton tm b ghp cc i trn th. Tuy nhin nu l th hn
hp (c c cung c hng v cnh v hng) th bi ton ngi a th Trung
Hoa l bi ton NP-y , trong trng hp ny, vic ch ra mt thut ton a
thc cng nh vic chng minh khng tn ti thut ton a thc gii quyt hin
vn ang l thch thc ca ngnh khoa hc my tnh.
Tht ng tic, s giao thng ca hu ht cc thnh ph trn th gii u
dng th hn hp (c c ng hai chiu v ng mt chiu) v nh vy cha
th c mt thut ton a thc ti u dnh cho cc nhn vin bu chnh.
b) Bi ton ngi du lch
Bi ton ngi du lch (Travelling Salesman) t ra l c thnh ph v chi ph di
chuyn gia hai thnh ph bt k trong thnh ph . Mt ngi mun i du
lch qua tt c cc thnh ph, mi thnh ph t nht mt ln v quay v thnh ph
xut pht, sao cho tng chi ph di chuyn l nh nht c th. Chng ta c th pht
biu bi ton ny trn m hnh th nh sau:
Bi ton: Cho th , , mi cnh c di (trng s) . Hy
tm mt chu trnh i qua tt c cc nh, mi nh t nht mt ln sao cho tng
di cc cnh i qua l nh nht.

216
Thc ra yu cu i qua mi nh t nht mt ln hay i qua mi nh ng mt ln
u kh nh nhau c. Bi ton ngi du lch l NP-y , hin ti cha c thut
ton a thc gii quyt, ch c mt s thut ton xp x hoc phng php
duyt nhnh cn m thi.
Bi tp
5.22. Trn mt phng cho
hnh ch nht c cc
cnh song song vi cc
trc to . Hy ch ra
mt chu trnh:
Ch i trn cnh
ca cc hnh ch
nht
Trn cnh ca mi
hnh ch nht,
ngoi tr nhng
giao im vi
cnh ca hnh ch
nht khc c th
qua nhiu ln,
nhng im cn
li ch c qua
ng mt ln.
5.23. Trong m ci ca Perse v Andromde c 2 hip s. Mi hip s c
khng qu 1 k th. Hy gip Cassiop, m ca Andromde xp 2
hip s ngi quanh mt bn trn sao cho khng c hip s no phi ngi cnh
k th ca mnh. Mi hip s s cho bit nhng k th ca mnh khi h n
sn rng.
5.24. Gray code: Mt hnh trn c chia thnh 2
hnh qut ng tm. Hy xp tt c cc xu nh
phn di vo cc hnh qut, mi xu vo
mt hnh qut sao cho bt c hai xu no hai
hnh qut cnh nhau u ch khc nhau ng 1
bit. V d vi 3:

100 000
001
011
010 110
111
101
A B
C D
E F
G H
I J
K L
M
N
P O Q
R
A B M F G R H P N E M C Q R K L O I N J Q P O D A

217
5.25. Bi ton m i tun: Trn bn c tng qut kch
thc vung 5 , 1000. Mt
qun m ang

c th di chuyn sang

nu |

|. |

| 2 (Xem
hnh v).

Hy tm hnh trnh ca qun m t xut pht t mt ty chn, i qua tt
c cc ca bn c, mi ng 1 ln.
V d vi 8
Hng dn: Nu coi cc ca bn c l cc nh
ca th v cc cnh l ni gia hai nh tng
ng vi hai m giao chn th d thy rng hnh
trnh ca qun m cn tm s l mt ng i
Hamilton. Tuy vy thut ton duyt thun ty l
bt kh thi vi d liu ln, bn c th th ci t
v ngi xem my tnh vn tot m hi .
gii quyt bi ton m i tun, c mt mo nh
c Warnsdorff a ra cch y gn 2 th k (1823). Mo ny khng ch
p dng c vo bi ton m i tun m cn c th kt hp vo thut ton
duyt tm ng i Hamilton trn th bt k nu bit chc ng i
tn ti (duyt tham phi hp).
Vi mi , ta gi bc ca , deg, , l s k vi , cha
c thm (k y theo ngha nh k ch khng phi l k cnh). t
ngu nhin qun m vo , no v c di chuyn qun m sang k
c bc nh nht. Nu i c ht bn c th xong, nu khng ta t ngu
nhin qun m vo mt xut pht khc v lm li.
Thut ton ny c th nghim v nhn thy rng vic tm ra mt b
, : 5 , 1000 chng trnh chy 10 giy cng l mt
chuynbt kh thi.
15 26 39 58 17 28 37 50
40 59 16 27 38 51 18 29
25 14 47 52 57 30 49 36
46 41 60 31 48 53 56 19
13 24 45 62 1 20 35 54
42 61 10 23 32 55 2 5
9 12 63 44 7 4 21 34
64 43 8 11 22 33 6 3







218
MC LC
CHUYN 1. THUT TON V PHN TCH THUT TON ........................................ 5
1. Thut ton ........................................................................................................ 5
2. Phn tch thut ton .......................................................................................... 6
Bi tp ................................................................................................................ 11
CHUYN 2. CC KIN THC C BN ........................................................................... 13
1. H m ........................................................................................................... 13
2. S nguyn t .................................................................................................. 14
3. c s, bi s ................................................................................................ 17
4. L thuyt tp hp ............................................................................................ 18
5. S Fibonacci .................................................................................................. 21
6. S Catalan ...................................................................................................... 23
7. X l s nguyn ln ........................................................................................ 24
Bi tp ................................................................................................................ 33
CHUYN 3. SP XP ........................................................................................................... 39
1. Pht biu bi ton ........................................................................................... 39
2. Cc thut ton sp xp thng dng ................................................................ 40
3. Sp xp bng m phn phi (Distribution Counting) .................................. 43
Bi tp ................................................................................................................ 51
CHUYN 4. THIT K GII THUT ............................................................................... 59
1. Quay lui (Backtracking) ................................................................................. 59
2. Nhnh v cn ................................................................................................. 71
3. Tham n (Greedy Method)............................................................................. 78
4. Chia tr (Divide and Conquer) .................................................................. 88
5. Quy hoch ng (Dynamic programming) .................................................... 97
Bi tp .............................................................................................................. 107
CHUYN 5. CC THUT TON TRN TH ........................................................ 126
1. Cc khi nim c bn ................................................................................... 127
2. Biu din th ............................................................................................ 132
3. Cc thut ton tm kim trn th .............................................................. 143
4. Tnh lin thng ca th ............................................................................ 158
5. Vi ng dng ca DFS v BFS .................................................................... 182
6. th Euler v th Hamilton ................................................................... 201
HNG DN GII BI TP ................................................................................................ thiu

219















Chu trch nhim xut bn :
Ch tch HQT kim Tng Gim c Ng Trn i
Ph Tng Gim c kim Tng bin tp nguyn qu thao
T chc bn tho v chu trch nhim ni dung:
Ph tng bin tp phan xun Thnh
Gim c Cng ty CP. Dch v Xut bn Gio dc H Ni phan k thi
Bin tp v sa bn in:
Nguyn th thanh xun
Trnh by ba:
LNG QUC HIP
Ch bn:
Nguyn th thanh xun
Ti liu gio khoa chuyn Tin Quyn 1
M s : 8I746H9
In ................... bn, kh 17 24 cm ti ...............................................................................
S in ................. ; S xut bn : ...............................................
In xong v np lu chiu thng .... nm 2009.

You might also like