Professional Documents
Culture Documents
07b6e3d3 6727 489d A0c5 C81f5f24daa1ly Thuyet Do Thi Le Minh Hoang
07b6e3d3 6727 489d A0c5 C81f5f24daa1ly Thuyet Do Thi Le Minh Hoang
07b6e3d3 6727 489d A0c5 C81f5f24daa1ly Thuyet Do Thi Le Minh Hoang
\1[
MC LC
0. M U .......................................................................................................................................... 3
1. CC KHI NIM C BN.............................................................................................................. 4
I. NH NGHA TH (GRAPH) ..................................................................................................................4
II. CC KHI NIM..........................................................................................................................................5
2. BIU DIN TH TRN MY TNH............................................................................................ 6
I. MA TRN LIN K (MA TRN K) ..........................................................................................................6
II. DANH SCH CNH.....................................................................................................................................7
III. DANH SCH K .........................................................................................................................................7
IV. NHN XT...................................................................................................................................................8
3. CC THUT TON TM KIM TRN TH ............................................................................. 10
I. BI TON.....................................................................................................................................................10
II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)..........................................11
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)...............................16
IV. PHC TP TNH TON CA BFS V DFS...................................................................................21
4. TNH LIN THNG CA TH ................................................................................................. 22
I. NH NGHA................................................................................................................................................22
II. TNH LIN THNG TRONG TH V HNG................................................................................23
III. TH Y V THUT TON WARSHALL ..............................................................................23
IV. CC THNH PHN LIN THNG MNH...........................................................................................26
5. VI NG DNG CA CC THUT TON TM KIM TRN TH ........................................ 36
I. XY DNG CY KHUNG CA TH .................................................................................................36
II. TP CC CHU TRNH C BN CA TH.......................................................................................38
III. NH CHIU TH V BI TON LIT K CU...........................................................................39
IV. LIT K KHP..........................................................................................................................................44
I. BI TON 7 CI CU ................................................................................................................................47
II. NH NGHA...............................................................................................................................................47
III. NH L.....................................................................................................................................................47
IV. THUT TON FLEURY TM CHU TRNH EULER .............................................................................48
V. CI T......................................................................................................................................................48
VI. THUT TON TT HN.........................................................................................................................50
7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON.................................... 53
I. NH NGHA................................................................................................................................................53
II. NH L ......................................................................................................................................................53
III. CI T.....................................................................................................................................................53
8. BI TON NG I NGN NHT........................................................................................... 57
I. TH C TRNG S...............................................................................................................................57
II. BI TON NG I NGN NHT......................................................................................................57
III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD BELLMAN...........58
IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON DIJKSTRA.............60
V. THUT TON DIJKSTRA V CU TRC HEAP.................................................................................63
VI. TRNG HP TH KHNG C CHU TRNH - TH T T P ................................................65
L Minh Hong
L thuyt th
\2[
L Minh Hong
L thuyt th
\3[
0. M U
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. Nhng tng c bn
ca n c a ra t th k th XVIII bi nh ton hc Thu S Leonhard Euler,
ng dng m hnh th gii bi ton v nhng cy cu Konigsberg ni
ting.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng li c nhiu ng dng hin
i. c bit trong khong vi mi nm tr li y, cng vi s ra i ca my tnh in t v s
pht trin nhanh chng ca Tin hc, L thuyt th cng c quan tm n nhiu hn. c bit
l cc thut ton trn th c nhiu ng dng trong nhiu lnh vc khc nhau nh: Mng my
tnh, L thuyt m, Ti u ho, Kinh t hc v.v... Chng hn nh tr li cu hi: Hai my tnh trong
mng c th lin h c vi nhau hay khng ?; hay vn phn bit hai hp cht ho hc c cng
cng thc phn t nhng li khc nhau v cng thc cu to cng c gii quyt nh m hnh
th. Hin nay, mn hc ny l mt trong nhng kin thc c s ca b mn khoa hc my tnh.
Trong phm vi mt chuyn , khng th ni k v ni ht nhng vn ca l thuyt th. Tp
bi ging ny 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. Cc khi nim
tru tng v cc php chng minh s c din gii mt cch hnh thc cho n gin v d hiu
ch khng phi l nhng chng minh cht ch dnh cho ngi lm ton. 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. Thng thng sau qu trnh rn luyn, hu ht nhng
ngi lp trnh gn nh phi thuc lng cc m hnh ci t, khi p dng c th ci t ng
ngay v hiu qu, khng b mt thi gi vo cc cng vic g ri. Bi vic g ri mt thut ton tc
l phi d li tng bc tin hnh v t tr li cu hi: "Ti bc nu ng th phi nh th no
?", thc ra l tiu ph thi gian v ch chng minh li tnh ng n ca thut ton trong
trng hp c th, vi mt b d liu c th.
Trc khi tm hiu cc vn v l thuyt th, bn phi c k thut lp trnh kh tt, ngoi ra
nu c tm hiu trc v cc k thut vt cn, quay lui, mt s phng php ti u ho, cc bi
ton quy hoch ng th s gip ch nhiu cho vic c hiu cc bi ging ny.
L Minh Hong
L thuyt th
\4[
1. CC KHI NIM C BN
I. NH NGHA TH (GRAPH)
L mt cu trc ri rc gm cc nh v cc cnh ni cc nh . c m t hnh thc:
G = (V, E)
V gi l tp cc nh (Vertices) v E gi l tp cc cnh (Edges). C th coi E l tp cc cp (u, v)
vi u v v l hai nh ca V.
Mt s hnh nh ca th:
S giao thng
Mng my tnh
Hnh 1: V d v m hnh th
V hng
C hng
V hng
n th
Hnh 2: Phn loi th
L Minh Hong
C hng
a th
L thuyt th
\5[
deg(v) = 2m
vV
deg
vV
( v) = deg + ( v) = m
vV
L Minh Hong
L thuyt th
\6[
1
2
3
4
5
1
0
0
0
1
0
2
0
0
0
0
1
3
1
0
0
0
0
4
0
1
0
0
0
5
0
0
1
0
0
1
5
L Minh Hong
L thuyt th
\7[
Ci t trn mng:
1
(1, 3)
2
(2, 4)
3
(3, 5)
4
(4, 1)
5
(5, 2)
2
nil
L thuyt th
\8[
1
Cch 1: (Forward Star) Dng mt mng cc nh, mng chia lm n on, on th i trong mng
lu danh sch cc nh k vi nh i: V d vi th sau, danh sch k s l mt mng A gm 12
phn t:
1
10
11
12
3 5 1 3 1 2 4 3
5
1
4
on 1
on 2
on 3
on 4
on 5
bit mt on nm t ch s no n ch s no, ta c mt mng lu v tr ring. Ta gi mng lu
v tr l mng Head. Head[i] s bng ch s ng lin trc on th i. Quy c Head[n + 1] s
bng m. Vi th bn th mng VT[1..6] s l: (0, 3, 5, 8, 10, 12)
Nh vy on t v tr Head[i] + 1 n Head[i + 1] trong mng A s cha cc nh k vi nh i.
Lu rng vi th c hng gm m cung th cu trc Forward Star cn phi cha m phn t,
vi th v hng m cnh th cu trc Forward Star cn phi cha 2m phn t
Cch 2: Dng cc danh sch mc ni: Vi mi nh i ca th, ta cho tng ng vi n mt danh
sch mc ni cc nh k vi i, c ngha l tng ng vi mt nh i, ta phi lu li List[i] l cht
ca mt danh sch mc ni. V d vi th trn, danh sch mc ni s l:
List[1]
List[2]
List[3]
List[4]
Nil
List[5]
Nil
Nil
Nil
Nil
u im ca danh sch k:
i vi danh sch k, vic duyt tt c cc nh k vi mt nh v 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
V l thuyt, so vi hai phng php biu din trn, danh sch k tt hn hn. Ch c iu,
trong trng hp c th m ma trn k hay danh sch cnh khng th hin nhc im th ta
nn dng ma trn k (hay danh sch cnh) bi ci t danh sch k c phn di dng hn.
IV. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho th th
c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn k m cho
nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt thi gian, ta cho
nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k ca mt th v
hng th ta c th khi to ban u mng A gm ton s 0, sau cho ngi s dng nhp cc
cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j, i] ln 1. Vic nhp c th cho
kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;
L Minh Hong
L thuyt th
\9[
var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j);
{Nhp mt cp (i, j) tng nh l nhp danh sch cnh}
if i <> 0 then
begin
{nhng lu tr trong b nh li theo kiu ma trn k}
Inc(A[i, j]);
Inc(A[j, i]);
end;
until i = 0;
{Nu ngi s dng nhp gi tr i = 0 th dng qu trnh nhp, nu khng th tip tc}
end.
Trong nhiu trng hp khng gian lu tr, vic chuyn i t cch biu din no sang cch
biu din khc khng c g kh khn. Nhng i vi thut ton ny th lm trn ma trn k ngn
gn hn, i vi thut ton kia c th lm trn danh sch cnh d dng hn v.v... Do , vi mc
ch d hiu, cc chng trnh sau ny s la chn phng php biu din sao cho vic ci t n
gin nht nhm nu bt c bn cht thut ton. Cn trong trng hp c th bt buc phi dng
mt cch biu din no khc, th vic sa i chng trnh cng khng tn qu nhiu thi gian.
L Minh Hong
L thuyt th
\ 10 [
L Minh Hong
L thuyt th
\ 11 [
4
6
7
8
3
GRAPH.INP
8 7 1 5
1 2
1 3
2 3
2 4
3 5
4 6
7 8
GRAPH.OUT
1, 2, 3, 5, 4, 6,
5<-3<-2<-1
L Minh Hong
L thuyt th
\ 12 [
procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
{Khi to th cha c cnh no}
ReadLn(n, m, S, F);
{c dng 1 ra 4 s n, m, S v F}
for i := 1 to m do
{c m dng tip ra danh sch cnh}
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure DFS(u: Integer);
var
v: Integer;
begin
Write(u, ', ');
Free[u] := False;
for v := 1 to n do
if Free[v] and a[u, v] then
begin
Trace[v] := u;
DFS(v);
end;
end;
{Thng bo ti c u}
{nh du u thm}
{Vi mi nh v cha thm k vi u}
{Lu vt ng i: nh lin trc v trong ng i t S ti v l u}
{Tip tc tm kim theo chiu su bt u t v}
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
{Vo dng th hai ca Output file}
if Free[F] then
{Nu F cha nh du thm tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt ng i, bt u t F}
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
{nh ngha li thit b nhp/xut chun thnh Input/Output file}
Close(Input);
Close(Output);
end.
Ch :
a)
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
b)
ng i t S ti F c th c nhiu, trn ch l mt trong s cc ng i. C th l ng
i c th t t in nh nht.
L Minh Hong
L thuyt th
c)
\ 13 [
4
6
2nd
5th
4
6
1st
1
8
3
6th
3rd
4th
Hnh 3: Cy DFS
Hi: nh 2 v 3 u k vi nh 1, nhng ti sao DFS(1) ch gi quy ti DFS(2) m khng gi DFS(3) ?.
Tr li: ng l c 2 v 3 u k vi 1, nhng DFS(1) s tm thy 2 trc v gi DFS(2). Trong DFS(2) s xt tt c cc nh k vi 2
m cha nh du th d nhin trc ht n tm thy 3 v gi DFS(3), khi 3 b nh du nn khi kt thc qu trnh quy gi
DFS(2), li v DFS(1) th nh 3 c thm ( b nh du) nn DFS(1) s khng gi DFS(3) na.
Hi: Nu F = 5 th ng i t 1 ti 5 trong chng trnh trn s in ra th no ?.
Tr li: DFS(5) do DFS(3) gi nn Trace[5] = 3. DFS(3) do DFS(2) gi nn Trace[3] = 2. DFS(2) do DFS(1) gi nn Trace[2] = 1. Vy
ng i l: 5 3 2 1.
Vi cy th hin qu trnh quy DFS trn, ta thy nu dy chuyn quy l: DFS(S) DFS
(u1) DFS(u2) ... Th th tc DFS no gi cui dy chuyn s c thot ra u tin, th tc
DFS(S) gi u dy chuyn s c thot cui cng. Vy nn chng, ta c th m t dy chuyn
quy bng mt ngn xp (Stack).
2. Ci t khng quy
Khi m t qu trnh quy bng mt ngn xp, ta lun lun cho ngn xp lu li dy chuyn
duyt su t nt gc (nh xut pht S).
<Thm S, nh du S thm>;
<y S vo ngn xp>;
{Dy chuyn quy ban u ch c mt nh S}
repeat
<Ly u khi ngn xp>;
{ang ng nh u}
if <u c nh k cha thm> then
begin
<Ch chn ly 1 nh v, l nh u tin k u m cha c thm>;
<Thng bo thm v>;
<y u tr li ngn xp>;
{Gi li a ch quay lui}
<y tip v vo ngn xp>;
{Dy chuyn duyt su c "ni" thm v na}
end;
{Cn nu u khng c nh k cha thm th ngn xp s ngn li, tng ng vi qu trnh li v ca dy chuyn DFS}
L Minh Hong
L thuyt th
\ 14 [
procedure DFS;
var
u, v: Integer;
begin
Write(S, ', '); Free[S] := False;
Push(S);
repeat
{Thm S, nh du S thm}
{Khi ng dy chuyn duyt su}
u := Pop;
{u l im cui ca dy chuyn duyt su hin ti}
for v := 1 to n do
if Free[v] and a[u, v] then
{Chn v l nh u tin cha thm k vi u, nu c:}
begin
Write(v, ', '); Free[v] := False; {Thm v, nh du v thm}
Trace[v] := u;
{Lu vt ng i}
Push(u); Push(v);
{Dy chuyn duyt su by gi l S ... u v}
Break;
end;
until Last = 0; {Ngn xp rng}
end;
L Minh Hong
L thuyt th
\ 15 [
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
DFS;
Result;
Close(Input);
Close(Output);
end.
2
1
8
5
Ngn xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)
1
2
3
5
3
2
4
6
4
2
1
2
3
5
Khng c
Khng c
4
6
Khng c
Khng c
Khng c
Khng c
Ngn xp sau mi bc
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)
Gii thch
Tin su xung thm 2
Tin su xung thm 3
Tin su xung thm 5
Li li
Li li
Tin su xung thm 4
Tin su xung thm 6
Li li
Li li
Li li
Li ht dy chuyn, Xong
L thuyt th
\ 16 [
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)
1. Ci t bng hng i
C s ca phng php ci t ny l "lp lch" duyt cc nh. Vic thm mt nh s ln lch
duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s c duyt
trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt nhng nh (x1,
x2, ..., xp) k vi S (nhng nh gn S nht). Khi thm nh x1 s li pht sinh yu cu duyt nhng
nh (u1, u2 ..., uq) k vi x1. Nhng r rng cc nh u ny "xa" S hn nhng nh x nn chng ch
c duyt khi tt c nhng nh x duyt xong. Tc l th t duyt nh sau khi thm x1 s l:
(x2, x3..., xp, u1, u2, ..., uq).
S
x1
u1
u2
x2
...
...
uq
xp
Hnh 4: Cy BFS
L thuyt th
\ 17 [
L thuyt th
\ 18 [
u, v: Integer;
begin
repeat
u := Pop;
{Ly mt nh u khi hng i}
Write(u, ', ');
{Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then
{Xt nhng nh v cha nh du k u}
begin
Push(v);
{a v vo hng i ch thm}
Free[v] := False;
{nh du v}
Trace[v] := u;
{Lu vt ng i: nh lin trc v trong ng i t S l u}
end;
until First > Last;
{Cho ti khi hng i rng}
end;
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.
V d: Xt th di y, nh xut pht S = 1.
4
2
1
Hng i
nh u
(ly ra t hng i)
(1)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)
2
3
4
5
6
L Minh Hong
Hng i
(sau khi ly u ra)
(3)
(4)
(5)
(6)
8
5
Cc nh v k u m
cha ln lch
2, 3
(2, 3)
4
5
6
Khng c
Khng c
(3, 4)
(4, 5)
(5, 6)
(6)
L thuyt th
\ 19 [
1
3
L Minh Hong
L thuyt th
\ 20 [
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
begin
FillChar(Free, n, True);
Free[S] := False; {Cc nh u cha nh du, ngoi tr nh S nh du}
Old := [S];
{Tp "c" khi to ban u ch c mi S}
end;
procedure BFS; {Thut ton loang}
var
u, v: Byte;
begin
repeat {Lp: dng Old tnh New}
New := [];
for u := 1 to n do
if u in Old then {Xt nhng nh u trong tp Old, vi mi nh u :}
begin
Write(u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Qut tt c nhng nh v cha b nh du m k vi u}
begin
Free[v] := False; {nh du v v lu vt ng i}
Trace[v] := u;
New := New + [v]; {a v vo tp New}
end;
end;
Old := New;
{Gn tp "c" := tp "mi" v lp li}
until Old = []; {Cho ti khi khng loang c na}
end;
procedure Result;
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th
\ 21 [
L Minh Hong
L thuyt th
\ 22 [
G1
G3
Hnh 7: Khp v cu
2. i vi th c hng G = (V, E)
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.
G 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, g gi l lin thng yu (weakly connected) nu th v
hng nn ca n l lin thng
L Minh Hong
L thuyt th
\ 23 [
Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n ng
bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Duyt.
III. TH Y V THUT TON WARSHALL
1. nh ngha:
th y vi n nh, k hiu Kn, l mt n th v hng m gia hai nh bt k ca n
u c cnh ni.
n.(n 1)
2
th y Kn c ng: C n =
cnh v bc ca mi nh u bng n - 1.
2
K3
K4
K5
Hnh 9: th y
2. Bao ng th:
Vi th G = (V, E), ngi ta xy dng th G' = (V, E') cng gm nhng nh ca G cn cc
cnh xy dng nh sau: ( y quy c gia u v u lun c ng i)
Gia nh u v v ca G' c cnh ni Gia nh u v v ca G c ng i
th G' xy dng nh vy c gi l bao ng ca th G.
L Minh Hong
L thuyt th
\ 24 [
hoc
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
L thuyt th
\ 25 [
1
3
2
5
4
12
10
11
GRAPH.INP
12 9
1 3
1 4
1 5
2 4
6 7
6 8
9 10
9 11
11 12
GRAPH.OUT
Connected Component 1:
1, 2, 3, 4, 5,
Connected Component 2:
6, 7, 8,
Connected Component 3:
9, 10, 11, 12,
L Minh Hong
L thuyt th
\ 26 [
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
{Thut ton Warshall}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Count := 0;
FillChar(Free, n, True); {Mi nh u cha c lit k vo thnh phn lin thng no}
for u := 1 to n do
if Free[u] then
{Vi mt nh u cha c lit k vo thnh phn lin thng no}
begin
Inc(Count);
WriteLn('Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then
{Xt nhng nh k u (trn bao ng)}
begin
Write(v, ', ');
{Lit k nh vo thnh phn lin thng cha u}
Free[v] := False; {Lit k nh no nh du nh }
end;
WriteLn;
end;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th
\ 27 [
1.
1st
5th
5th
2nd
1st
2nd
5th
2nd
6th
3rd
u
4th
TH1: v l tin bi ca u
(u, v) l cung ngc
6th
3rd
6th
3rd
7th
7th
v
4th
TH2: v l hu du ca u
(u, v) l cung xui
7th
4th
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 tm kim, nhng
cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.
2. Cy tm kim DFS v cc thnh phn lin thng mnh
nh l 1:
Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a ti b cng
nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b ti a.
Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b c ng ti
a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc l vC. Tng
t vi mt nh nm trn ng i t b ti a.
nh l 2:
Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho mi nh ca
C u thuc nhnh DFS gc r.
Chng minh:
L Minh Hong
L thuyt th
\ 28 [
Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin thng mnh ca th
ban u tho mn tnh cht ti i tc l vic thm vo thnh phn mt tp hp nh khc s lm
mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo chiu
su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k ca C, do C
lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = x0, x1, ..., xk = v)
T nh l 1, tt c cc nh x1, x2, ..., xk u thuc C nn chng s phi thm sau nh r. Khi th
tc Visit(r) c gi th tt c cc nh x1, x2..., xk=v u cha thm; v th tc Visit(r) s lit k tt
c nhng nh cha thm n c t r bng cch xy dng nhnh gc r ca cy DFS, nn cc nh
x1, x2, ..., xk = v s thuc nhnh gc r ca cy DFS. Bi chn v l nh bt k trong C nn ta c iu
phi chng minh.
nh r trong chng minh nh l - nh thm trc tt c cc nh khc trong C - gi l cht ca
thnh phn C. Mi thnh phn lin thng mnh c duy nht mt cht. Xt v v tr trong cy tm
kim DFS, cht ca mt thnh phn lin thng 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 3:
Lun tm c nh cht a tho mn: Qu trnh tm kim theo chiu su bt u t a khng
thm c bt k mt cht no khc. (Tc l nhnh DFS gc a khng cha mt cht no ngoi a)
chng hn ta chn a l cht c thm sau cng trong mt dy chuyn quy hoc chn a l cht
thm sau tt c cc cht khc. Vi cht a nh vy th cc nh thuc nhnh DFS gc a chnh l
thnh phn lin thng mnh cha a.
Chng minh:
Vi mi nh v nm trong nhnh DFS gc a, xt b l cht ca thnh phn lin thng mnh cha v.
Ta s chng minh a b. Tht vy, theo nh l 2, v phi nm trong nhnh DFS gc b. Vy v nm
trong c nhnh DFS gc a v nhnh DFS gc b. Gi s phn chng rng ab th s c hai kh nng
xy ra:
b
...
...
...
a
b
...
...
...
...
v
...
...
...
...
v
...
Kh nng 1: a b v
Kh nng 1: b a v
L Minh Hong
L thuyt th
\ 29 [
Theo nh l 2, ta c thnh phn lin thng mnh cha a nm trong nhnh DFS gc a, theo
chng minh trn ta li c: Mi nh trong nhnh DFS gc a nm trong thnh phn lin thng
mnh cha a. Kt hp li c: Nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
3. Thut ton Tarjan (R.E.Tarjan - 1972)
Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht no
khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b nhnh DFS
gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v khng cha cht no
khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc v. 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.
1
8
3
4
9
10
10
6
11
7
11
7
L thuyt th
\ 30 [
b ri. Hn na cn c th chng minh c rng, khi thut ton tin hnh nh trn th nu nh t
mt nh v ca mt nhnh DFS gc r c mt cung cho i ti mt nhnh khc th r khng l
cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti nhnh
thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung cho (v, v')
i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn lin thng cha
v'. Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r. C hai kh nng xy
ra:
Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l khi
thm r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s khng
c tnh n na.
Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u). Ta so snh Low[u] v
Numbering[u]. Nu nh Low[u] = Numbering[u] th u l cht, bi khng c cung ni t mt nh
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc thnh phn
lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch L c t chc di dng ngn xp v
dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt nh u, ta y ngay
nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh DFS gc u s c y
vo ngn xp L ngay sau u. Nu u l cht, ta ch vic ly cc nh ra khi ngn xp L cho ti khi ly
ti nh u l s c nhnh DFS gc u cng chnh l thnh phn lin thng mnh cha u.
procedure Visit(uV);
begin
L Minh Hong
L thuyt th
\ 31 [
Bi thut ton Tarjan ch l sa i mt cht thut ton DFS, cc thao tc vo/ra ngn xp c
thc hin khng qu n ln. Vy nn nu th c n nh v m cung th phc tp tnh ton ca
thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch k, l O(n2)
trong trng hp biu din bng ma trn k v l O(n.m) trong trng hp biu din bng danh
sch cnh.
Mi th sn sng, di y l ton b chng trnh. Trong chng trnh ny, ta s dng:
Mng Free kiu Boolean, Free[u] = True nu u cha b lit k vo thnh phn lin thng no,
tc l u cha b loi khi th.
m dng tip theo, mi dng ghi hai s nguyn u, v cch nhau mt du cch th hin c cung
(u, v) trong th
Output: file vn bn GRAPH.OUT
Lit k cc thnh phn lin thng mnh
L Minh Hong
L thuyt th
\ 32 [
1
2
8
3
4
9
10
6
11
GRAPH.INP
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
GRAPH.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,
PROG04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Numbering, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Last: Integer;
{Nhp d liu (t thit b nhp chun)}
procedure Enter;
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
end;
end;
{Khi to}
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0);
FillChar(Free, SizeOf(Free), True);
Last := 0;
Count := 0;
ComponentCount := 0;
end;
{y mt nh v vo ngn xp}
L Minh Hong
L thuyt th
\ 33 [
Inc(ComponentCount);
WriteLn('Component ', ComponentCount, ': ');
repeat
v := Pop;
{Ly dn cc nh ra khi ngn xp}
Write(v, ', ');
{Lit k cc nh }
Free[v] := False; {Ri loi lun khi th}
until v = u;
{Cho ti khi ly ti nh u}
WriteLn;
end;
end;
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
{sau ny phi hu b thnh phn lin thng gm mi mt nh gi }
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Close(Input);
Close(Output);
end.
Bi tp:
1. Phng php ci t nh trn c th ni l rt hay v hiu qu, i hi ta phi hiu r bn cht
thut ton, nu khng th rt d nhm. Trn thc t, cn c mt phng php khc d hiu hn, tuy
tnh hiu qu c km hn mt cht. Hy vit chng trnh m t phng php sau:
Vn dng thut ton tm kim theo chiu su vi th tc Visit ni u mc, nh s li cc nh t
1 ti n theo th t duyt xong, sau o chiu tt c cc cung ca th. Xt ln lt cc nh
L Minh Hong
L thuyt th
\ 34 [
10
8
6
9
2
9
10
1
11
nh s li, o chiu cc cung v duyt BFS vi cch chn cc nh xut pht ngc li vi th t duyt xong
(Th t 11, 10... 3, 2, 1)
2. Thut ton Warshall c th p dng tm bao ng ca th c hng, vy hy kim tra tnh lin
thng mnh ca mt th c hng bng hai cch: Dng cc thut ton tm kim trn th v
thut ton Warshall, sau so snh u, nhc im ca mi phng php
3. M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi k t:
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
L Minh Hong
L thuyt th
\ 35 [
L Minh Hong
L thuyt th
\ 36 [
L thuyt th
\ 37 [
T1
T2
Hnh 13: th G v mt s v d cy khung T1, T2, T3 ca n
T3
L Minh Hong
L thuyt th
\ 38 [
c ni hai cy khc nhau hay khng cng nh k thut hp nht hai cy s c bn k hn trong
thut ton Kruskal 9.
b) Xy dng cy khung bng cc thut ton tm kim trn th.
p dng thut ton BFS hay DFS bt u t nh S, ti mi bc t nh u ti thm nh v, ta thm
vo thao tc ghi nhn lun cnh (u, v) vo cy khung. Do th lin thng nn thut ton s xut
pht t S v ti thm tt c cc nh cn li, mi nh ng mt ln, tc l qu trnh duyt s ghi
nhn c ng n - 1 cnh. Tt c nhng cnh khng to thnh chu trnh n bi thut ton
khng 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.
1
10
11
10
11
Hnh 14: Cy khung DFS v cy khung BFS (Mi tn ch chiu i thm cc nh)
L thuyt th
\ 39 [
Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton tm
kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc cung na.
Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS thm
trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s xy
dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong nhnh
DFS gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v, v l
tin bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung (v,
u). (Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v), ta c
mt php nh chiu th gi l php nh chiu DFS.
L Minh Hong
L thuyt th
\ 40 [
1
2
3
10
10
Nhn xt 3:
Vi php nh chiu nh trn, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc chiu
nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht DFS, cung
ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung ngc th cung
xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi ca cy
khung DFS. Chnh v vy, mi chu trnh c s 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 (u, v) th truy vt
ng i ca DFS tm ng t v n u, sau ni thm cung ngc (u, v) c mt chu
trnh c s).
nh l: 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 G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt cnh
c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc cnh nh
hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c hng trong G'.
Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu DFS
s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong
G'. Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u
phi thuc mt chu trnh c s no , nn s c mt chu trnh c s cha c u v v. Chu trnh
L Minh Hong
L thuyt th
\ 41 [
c s qua php nh chiu DFS vn l chu trnh trong G' nn i theo cc cnh nh hng ca
chu trnh , ta c th i t u ti v v ngc li.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x0, x1, ..., xn=v).
V (xi, xi + 1) l cnh ca G nn trong G', t xi c th n c xi+1. Suy ra t u cng c th n
c v bng cc cnh nh hng ca G'.
2. Ci t
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.
Ta s ci t mt thut ton vi mt th v hng: lit k cc cu v nh chiu cc cnh
c mt th mi c t thnh phn lin thng mnh nht:
nh s cc nh theo th t thm DFS, gi Numbering[u] l s th t ca nh u theo cch nh
s . Trong qu trnh tm kim DFS, duyt qua cnh no nh chiu lun cnh . nh ngha
thm Low[u] l gi tr Numbering nh nht ca nhng nh n c t nhnh DFS gc u bng mt
cung ngc. Tc l nu nhnh DFS gc u c nhiu cung ngc hng ln trn pha gc cy th ta
ghi nhn li cung ngc hng ln cao nht. Nu nhnh DFS gc u khng cha cung ngc th ta
cho Low[u] = +. C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u (Numbering[u]) v khi gn
Low[u] = +.
Sau , xt tt c nhng nh v k u, nh chiu cnh (u, v) thnh cung (u, v). C hai kh nng
xy ra:
v cha thm th ta gi Visit(v) thm v v cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Low[v])
v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Numbering[v])
D thy cch tnh nh vy l ng n bi nu v cha thm th nhnh DFS gc v nm trong
nhnh DFS gc u v nhng cung ngc trong nhnh DFS gc v cng l cung ngc trong nhnh
DFS gc u. Cn nu v thm th (u, v) s l cung ngc.
1 1
1
1
2
1
3
4
3 8
5
4
9
10 3
8
6
10
th v hng
7 5
L Minh Hong
L thuyt th
\ 42 [
1
3
2
4
10
11
GRAPH.INP
11 14
1 2
1 3
2 3
2 4
4 5
4 6
4 9
5 7
5 10
6 8
7 10
7 11
8 9
10 11
GRAPH.OUT
Bridges:
(4, 5)
(2, 4)
Directed Edges:
1 -> 2
2 -> 3
2 -> 4
3 -> 1
4 -> 5
4 -> 6
5 -> 7
6 -> 8
7 -> 10
8 -> 9
9 -> 4
10 -> 5
10 -> 11
11 -> 7
L thuyt th
\ 43 [
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Numbering, Low: array[1..max] of Integer;
n, Count: Integer;
procedure Enter;
var
f: Text;
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
Assign(f, 'GRAPH.INP'); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {Numbering[u] = 0 u cha thm}
Count := 0;
end;
procedure Visit(u: Integer);
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; {nh s th t thm cho nh u, u tr thnh thm}
Low[u] := n + 1;
{Khi gn Low[u] bng mt gi tr ln hn tt c Numbering}
for v := 1 to n do
if a[u, v] then {Xt mi nh v k u}
begin
a[v, u] := False;
{nh chiu cnh (u, v) thnh cung (u, v)}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Visit(v);
{i thm v}
if Low[v] > Numbering[u] then {(u, v) l cu}
WriteLn('(', u, ', ', v, ')');
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
end;
procedure Solve;
var
u, v: Integer;
begin
WriteLn('Bridges: ');
{Dng DFS nh chiu th v lit k cu}
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
WriteLn('Directed Edges: ');
{Qut li ma trn k in ra cc cnh nh hng}
for u := 1 to n do
for v := 1 to n do
if a[u, v] then WriteLn(u, ' -> ', v);
L Minh Hong
L thuyt th
\ 44 [
end;
begin
Enter;
Init;
Solve;
end.
Qu trnh duyt cho mt rng cc cy DFS. Cc cung duyt qua c ba loi: cung DFS, cung ngc
v cung xui, khng b ri hnh, ta ch u tin v cung DFS hoc cung ngc:
11
2
3
12
4
13
10
17
14
15
16
Hy nhnh DFS gc nh r no
Nu mi nhnh con ca nhnh DFS gc r u c mt cung ngc ln ti mt tin bi ca r th r
khng l khp. Bi nu trong th ban u, ta b r i th t mi nh bt k ca nhnh con, ta
L Minh Hong
L thuyt th
\ 45 [
5
4
10
9
8
13
7
11
12
GRAPH.INP
13 15
1 3
2 4
2 5
3 6
3 7
4 8
4 11
5 9
5 10
6 7
8 11
8 12
9 10
9 13
11 12
GRAPH.OUT
Cut vertices:
2, 3, 4, 5, 9,
L Minh Hong
L thuyt th
\ 46 [
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True; a[v, u] := True;
end;
end;
procedure Visit(u: Integer);
{Tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; Low[u] := n + 1; nC[u] := 0;
Mark[u] := False;
for v := 1 to n do
if a[u, v] then
{Xt mi v k u}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Inc(nc[u]);
{Tng bin m s con ca u ln 1}
Visit(v);
{Thm v}
{Nu nhnh DFS gc v khng c cung ngc ln mt tin bi ca u tc l Low[v] Numbering[u]}
L Minh Hong
L thuyt th
\ 47 [
I. BI TON 7 CI CU
Thnh ph Konigsberg thuc Ph (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 n trong a th cha tt c cc cnh ?.
C
B
B
II. NH NGHA
1. Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
2. ng i n cha tt c cc cnh ca th c gi l ng i Euler
3. Mt th c chu trnh Euler c gi l th Euler
4. Mt th c ng i Euler c gi l th na Euler.
R rng mt th Euler th phi l na Euler nhng iu ngc li th khng phi lun ng
III. NH L
1. Mt th v hng lin thng G = (V, E) c chu trnh Euler khi v ch khi mi nh ca n
u c bc chn: deg(v) 0 (mod 2) (vV)
2. Mt th v hng lin thng c ng i Euler nhng khng c chu trnh Euler khi v
ch khi n c ng 2 nh bc l
3. Mt thi c hng lin thng yu G = (V, E) c chu trnh Euler th mi nh ca n c bn
bc ra bng bn bc vo: deg+(v) = deg-(v) (vV); Ngc li, nu G lin thng yu v mi
nh ca n c bn bc ra bng bn bc vo th G c chu trnh Euler, hay G s l lin thng
mnh.
4. Mt th c hng lin thng yu G = (V, E) c ng i Euler nhng khng c chu trnh
Euler nu tn ti ng hai nh u, v V sao cho deg+(u) - deg-(u) = deg-(v) - deg+(v) = 1, cn
tt c nhng nh khc u v v u c bn bc ra bng bn bc vo.
L Minh Hong
L thuyt th
\ 48 [
2
7
7
1
8
3
8
3
Nu xut pht t nh 1, c hai cch i tip: hoc sang 2 hoc sang 3, gi s ta s sang 2 v xo
cnh (1, 2) va i qua. T 2 ch c cch duy nht l sang 4, nn cho d (2, 4) l cu ta cng phi i
sau xo lun cnh (2, 4). n y, cc cnh cn li ca th c th v nh trn bng nt lin,
cc cnh b xo c v bng nt t.
By gi ang ng nh 4 th ta c 3 cch i tip: sang 3, sang 5 hoc sang 6. V (4, 3) l cu nn
ta s khng i theo cnh (4, 3) m s i (4, 5) hoc (4, 6). Nu i theo (4, 5) v c tip tc i nh
vy, ta s c chu trnh Euler l (1, 2, 4, 5, 7, 8, 6, 4, 3, 1). Cn i theo (4, 6) s tm c chu trnh
Euler l: (1, 2, 4, 6, 8, 7, 5, 4, 3, 1).
2. i vi th c hng lin thng yu, mi nh u c bn bc ra bng bn bc vo.
Bng cch "lm dng thut ng", ta c th m t c thut ton tm chu trnh Euler cho c th
c hng cng nh v hng:
Th nht, di y nu ta ni cnh (u, v) th hiu l cnh ni nh u v nh v trn th v
hng, hiu l cung ni t nh u ti nh v trn th c hng.
Th hai, ta gi cnh (u, v) l "mt i khng tr li" nu nh t u ta i ti v theo cnh , sau
xo cnh i th khng c cch no t v quay li u.
Vy th thut ton Fleury tm chu trnh Euler c th m t nh sau:
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.
V. CI T
Ta s ci t thut ton Fleury trn mt a th v hng. n gin, ta coi th ny c chu
trnh Euler, cng vic ca ta l tm ra chu trnh thi. Bi vic kim tra tnh lin thng cng nh
kim tra mi nh u c bc chn n gi c th coi l chuyn nh.
Input: file vn bn EULER.INP
Dng 1: Cha s nh n ca th (n 100)
Cc dng tip theo, mi dng cha 3 s nguyn dng cch nhau t nht 1 du cch c dng: u
v k cho bit gia nh u v nh v c k cnh ni
Output: file vn bn EULER.OUT ghi chu trnh EULER
L Minh Hong
L thuyt th
\ 49 [
EULER.INP
4
1 2 1
1 3 2
1 4 1
2 3 1
3 4 1
EULER.OUT
1
2
L Minh Hong
L thuyt th
\ 50 [
begin
Current := 1;
Write(1:5); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]);
{Xo b cnh va i qua}
Write(Next:5);
{In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
Current := Next;
{Li tip tc vi nh ang ng l Next}
end;
until Next = 0; {Cho ti khi khng i tip c na}
WriteLn;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th
\ 51 [
Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi nh
c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung nh
hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s phi cha
ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s cnh qu ln th s
khng khng gian nh m t Stack (Ta c th vi th ch gm 2 nh nhng gia hai nh
c ti 106 cnh ni s thy ngay). L do thut ton ch c th p dng trong trng hp s cnh c
gii hn bit trc nh l nh vy.
PROG06_2.PAS * Thut ton hiu qu tm chu trnh Euler
program Euler_Circuit;
const
max = 100;
maxE = 20000;
{S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, last: Integer;
procedure Enter;
{Nhp d liu}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin
Inc(last);
Stack[last] := v;
end;
function Pop: Integer;
begin
Pop := Stack[last];
Dec(last);
end;
procedure FindEulerCircuit;
var
L Minh Hong
L thuyt th
\ 52 [
u, v, count: Integer;
begin
Stack[1] := 1;
{Khi to ngn xp ban u ch gm nh 1}
last := 1;
count := 0;
while last <> 0 do {Chng no ngn xp cha rng}
begin
u := Get;
{Xc nh u l phn t nh ngn xp}
for v := 1 to n do
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]);
{Xo cnh khi th}
Push(v);
{y nh tip theo vo ngn xp}
Break;
end;
if u = Get then
{Nu phn t nh ngn xp vn l u vng lp trn khng tm thy nh no k vi u}
begin
Inc(count);
Write(Pop:5, ' ');
{In ra phn t nh ngn xp}
if count mod 16 = 0 then WriteLn; {Output khng qu 16 s trn mt dng}
end;
end;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.
Bi tp:
Trn mt phng cho n 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.
C
M D A B C M F G N L I J K N H E M
L Minh Hong
L thuyt th
\ 53 [
G1
G2
G3
th G1 c chu trnh Hamilton (a, b, c, d, e, a). G2 khng c chu trnh Hamilton v deg(a) = 1
nhng c ng i Hamilton (a, b, c, d). G3 khng c c chu trnh Hamilton ln ng i Hamilton
II. NH L
1.
2.
3.
III. CI T
Di y ta s ci t mt chng trnh lit k tt c cc chu trnh Hamilton xut pht t nh 1, cc
chu trnh Hamilton khc c th c c bng cch hon v vng quanh. Lu rng cho ti nay,
ngi ta vn cha tm ra mt phng php no thc s hiu qu hn phng php quay lui tm
d ch mt chu trnh Hamilton cng nh ng i Hamilton trong trng hp th tng qut.
Input: file vn bn HAMILTON.INP
Dng 1 ghi s nh n ( 100) v s cnh m ca th cch nhau 1 du cch
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau 1 du cch, th hin u,
v l hai nh k nhau trong th
Output: file vn bn HAMILTON.OUT lit k cc chu trnh Hamilton
L Minh Hong
L thuyt th
\ 54 [
1
5
HAMILTON.INP
5 6
1 2
1 3
2 4
3 5
4 1
5 2
HAMILTON.OUT
1 3 5 2 4 1
1 4 2 5 3 1
procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
i, u, v, m: 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 PrintResult; {In kt qu nu tm thy chu trnh Hamilton}
var
i: Integer;
begin
for i := 1 to n do Write(X[i], ' ');
WriteLn(X[1]);
end;
procedure Try(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do
{nh th i (X[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi X[i - 1] v cha b i qua }
begin
x[i] := j;
{Th mt cch chn X[i]}
if i < n then
{Nu cha th chn n X[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Try(i + 1);
{ cc bc th k tip khng chn phi nh j na}
Free[j] := True;
{S th phng n khc cho X[i] nn s b nh du nh va th}
end
else {Nu th chn n X[n]}
if a[j, X[1]] then PrintResult; {v nu X[n] li k vi X[1] th ta c chu trnh Hamilton}
end;
end;
L Minh Hong
L thuyt th
\ 55 [
begin
{nh hng thit b nhp/xut chun}
Bi tp:
1. Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
2. Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
3. Trong m ci ca Pc-xy v An-r-nt c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Ca-xi--b, m ca An-r-nt xp 2n 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.
100 000
4. Gray code: Mt hnh trn c chia thnh 2n hnh qut ng tm. Hy xp
101
001
tt c cc xu nh phn di n vo cc hnh qut, mi xu vo mt hnh
111
011
qut sao cho bt c hai xu no hai hnh qut cnh nhau u ch khc
nhau ng 1 bt. V d vi n = 3 hnh v bn
110 010
*
5. Thch : Bi ton m i tun: Trn bn c tng qut kch thc n x n
vung (n chn v 6 n 20). Trn mt no c t mt qun m. Qun m ang (X1,
Y1) c th di chuyn sang (X2, Y2) nu X1-X2.Y1-Y2 = 2 (Xem hnh v).
Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi
ng 1 ln.
V d:
45
2
43
16
47
30
61
14
18
97
72
41
16
79
36
39
14
11
Vi n = 8;
42
3
17
44
46
1
31
48
60
37
15
64
56
13
29
62
71
42
17
96
83
40
15
12
33
38
Vi n = 10;
100
43
19
70
98
95
73
84
80
93
35
82
78
75
37
34
10
59
13
32
8
21
6
51
10
23
26
53
22
87
26
47
62
51
28
3
54
7
25
46
23
50
27
48
53
6
29
4
L thuyt th
\ 56 [
L Minh Hong
L thuyt th
\ 57 [
L thuyt th
\ 58 [
C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy F, F1, F2, ... khng cha nh lp
li v kt thc S. Lt ngc th t dy cho ta ng i ngn nht t S ti F.
...
F1
F2
Tuy nhin, trong a s trng hp, ngi ta khng s dng phng php ny m s kt hp lu vt
ng i ngay trong qu trnh tm kim.
Di y ta s xt mt s thut ton tm ng i ngn nht t nh S ti nh F trn n th c
hng G = (V, E) c n nh v m cung. Trong trng hp n th v hng vi trng s khng
m, bi ton tm ng i ngn nht c th dn v bi ton trn th c hng bng cch thay mi
cnh ca n bng hai cung c hng ngc chiu nhau. Lu rng cc thut ton di y s lun
lun tm c ng i ngn nht l ng i c bn.
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 100), s cung m ca th, nh xut pht S, nh ch F cch nhau
t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th hin (u,
v) l mt cung E v trng s ca cung l c[u,v] (c[u, v] l s nguyn c gi tr tuyt i
100)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t S ti F v di ng i
1
20
20
6
MINPATH.INP
6 7 1 4
1 2 1
1 6 20
2 3 2
3 4 20
3 6 3
5 4 5
6 5 4
MINPATH.OUT
Distance from 1 to 4: 15
4<-5<-6<-3<-2<-1
L thuyt th
\ 59 [
for u := 1
for v :=
if u =
for i := 1
end;
to n do
1 to n do
v then c[u, v] := 0 else c[u, v] := maxC;
to m do ReadLn(u, v, c[u, v]);
procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure Ford_Bellman;
L Minh Hong
{Khi to}
L thuyt th
\ 60 [
var
Stop: Boolean;
u, v, CountLoop: Integer;
begin
CountLoop := 0;
{Bin m s ln lp}
repeat
Stop := True;
for u := 1 to n do
for v := 1 to n do
if d[v] > d[u] + c[u, v] then
{Nu u, v tho mn d[v] > d[u] + c[u, v] th ti u li d[v]}
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
{Lu vt ng i}
Stop := False;
end;
Inc(CountLoop);
until Stop or (CountLoop >= n - 2);
{Thut ton kt thc khi khng sa nhn cc d[v] c na hoc lp n-2 ln }
end;
procedure PrintResult; {In ng i t S ti F}
begin
if d[F] = maxC then
{Nu d[F] vn l + th tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt tm ng i}
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th
\ 61 [
L thuyt th
\ 62 [
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
FillChar(Free, SizeOf(Free), True);
end;
procedure Dijkstra;
var
i, u, v: Integer;
min: Integer;
begin
repeat
u := 0; min := maxC;
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
{Thut ton s kt thc khi cc nh t do u c nhn + hoc chn n nh F}
if (u = 0) or (u = F) then Break;
{C nh nhn nh u}
Free[u] := False;
{Dng nh u ti u nhn nhng nh t do k vi u}
for v := 1 to n do
if Free[v] and (d[v] > d[u] + c[u, v]) then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end;
until False;
end;
procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Dijkstra;
PrintResult;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th
\ 63 [
L thuyt th
\ 64 [
Close(inp);
{n y, ta xc nh c head[u] l v tr cui ca danh sch k nh u trong adj^}
Reset(inp);
{c file ln 2, vo cu trc Forward Start}
ReadLn(inp);
{B qua dng u tin Input file}
for i := 1 to m do
begin
ReadLn(inp, u, v, c);
adj^[head^[u]] := v;
adjCost^[head^[u]] := c;
Dec(head^[u]);
end;
head^[n + 1] := m;
Close(inp);
end;
procedure Init;
{Khi to d[i] = di ng i ngn nht t S ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[S] := 0;
FillChar(Free, SizeOf(Free), True);
FillChar(Pos, SizeOf(Pos), 0);
nHeap := 0;
end;
procedure Update(v: Integer);
{nh v va c sa nhn, cn phi chnh li Heap}
var
parent, child: Integer;
begin
child := Pos[v];
{child l v tr ca v trong Heap}
if child = 0 then {Nu v cha c trong Heap th Heap phi b sung thm 1 phn t v coi child = nt l cui Heap}
begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin
{Nu nh lu nt parent u tin km hn v th nh s b y xung nt con child}
heap[child] := heap[parent]; {y nh lu trong nt cha xung nt con}
Pos[heap[child]] := child;
{Ghi nhn li v tr mi ca nh }
child := parent;
{Tip tc xt ln pha nt gc}
parent := child div 2;
end;
{Thao tc "ko xung" trn to ra mt "khong trng" ti nt child ca Heap, nh v s c t vo y}
heap[child] := v;
Pos[v] := child;
end;
function Pop: Integer;
var
r, c, v: Integer;
begin
Pop := heap[1];
{Nt gc Heap cha nh c nhn t do nh nht}
v := heap[nHeap]; {v l nh nt l cui Heap, s c o ln u v vun ng}
Dec(nHeap);
r := 1;
{Bt u t nt gc}
while r * 2 <= nHeap do {Chng no r cha phi l l}
begin
{Chn c l nt cha nh u tin hn trong hai nt con}
c := r * 2;
if (c < nHeap) and (d[heap[c + 1]] < d[heap[c]]) then Inc(c);
{Nu v u tin hn c nh cha trong C, th thot ngay}
L thuyt th
\ 65 [
L Minh Hong
L thuyt th
\ 66 [
2
4
2
5
4
5
6
6
3
L thuyt th
\ 67 [
procedure Number;
{Thut ton nh s cc nh}
var
deg: array[1..max] of Integer;
u, v: Integer;
front: Integer;
begin
-
count := 0;
for u := 1 to n do
if deg[u] = 0 then
begin
Inc(count); List[count] := u;
end;
{front: Ch s phn t ang xt, count: S phn t trong danh sch}
front := 1;
while front <= count do
begin
{Xt phn t th front trong danh sch, y con tr front sang phn t k tip}
u := List[front]; Inc(front);
for v := 1 to n do
if c[u, v] <> maxC then {Xt nhng cung (u, v) v "loi" khi th deg-(v) gim 1}
begin
Dec(deg[v]);
if deg[v] = 0 then
{Nu v tr thnh nh khng c cung i vo}
begin
{a tip v vo danh sch List}
Inc(count);
List[count] := v;
end;
end;
end;
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure FindPath;
{Thut ton quy hoch ng tm ng i ngn nht trn th khng chu trnh}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j];
{Dng List[i] ti u nhn List[j] vi i < j}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;
L Minh Hong
L thuyt th
\ 68 [
procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Number;
if Count < n then
WriteLn('Error: Circuit Exist')
else
begin
Init;
FindPath;
PrintResult;
end;
Close(Input);
Close(Output);
end.
L thuyt th
\ 69 [
ck[u, v] = ck-1[u, v]
C i qua nh k th ng i s l ni ca mt ng i t u ti k v mt ng i t k ti
v, hai ng i ny ch i qua cc nh trung gian thuc tp {1, 2, ..., k - 1}.
ck[u, v] = ck-1[u, k] + ck-1[k, v].
V ta mun ck[u, v] l cc tiu nn suy ra: ck[u, v] = min(ck-1[u, v], ck-1[u, k] + ck-1[k, v]).
V cui cng, ta quan tm ti cn[u, v]: di ng i ngn nht t u ti v m ch i qua cc nh
trung gian thuc tp {1, 2, ..., n}.
Khi ci t, th ta s khng c cc khi nim ck[u, v] m s thao tc trc tip trn cc trng s c[u,
v]. c[u, v] ti bc ti u th k s c tnh ton ti u qua cc gi tr c[u, v]; c[u, k] v c[k, v]
ti bc th k - 1. V nu ci t di dng ba vng lp for lng nh trn, do c s ti u bc cu
ti mi bc, tc ti u c[u, v] ch tng ln ch khng th gim i c.
PROG08_5.PAS * Thut ton Floyd
program Shortest_Path_by_Floyd;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, S, F: Integer;
procedure LoadGraph;
{Nhp d liu, th khng c c chu trnh m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
procedure Floyd;
var
k, u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do Trace[u, v] := v; {Gi s ng i ngn nht gia mi cp nh l ng trc tip}
{Thut ton Floyd}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
if c[u, v] > c[u, k] + c[k, v] then
begin
c[u, v] := c[u, k] + c[k, v];
Trace[u, v] := Trace[u, k];
end;
end;
L thuyt th
Write(S, '->');
S := Trace[S, F];
until S = F;
WriteLn(F);
end;
\ 70 [
{Nhc li rng Trace[S, F] l nh lin sau S trn ng i ti F}
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Floyd;
PrintResult;
Close(Input);
Close(Output);
end.
Khc bit r rng ca thut ton Floyd l khi cn tm ng i ngn nht gia mt cp nh khc,
chng trnh ch vic in kt qu ch khng phi thc hin li thut ton Floyd na.
VIII. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i du
trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra trng hp
c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh hay
danh sch k c trng s, nn ta u a v th y v em trng s + gn cho nhng
cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng + nn ta
s phi chn mt s dng ln thay. Nh th no l ln? s phi ln hn tt c
trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt hn ng i
trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh trng s cc cnh
vo c 300 chng hn th gi tr khng th chn trong phm vi Integer hay Word. Ma trn c
s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc chng trnh trn phi i
li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng hn nh vn lng ph b nh.
khc phc, ngi ta c th ci t bng danh sch k km trng s hoc s dng nhng k thut
nh du kho lo trong tng trng hp c th. Tuy nhin c mt iu chc chn: khi th cho s
nh cng nh trng s cc cnh vo khong 300 th cc trng s c[u, v] trong thut ton Floyd
v cc nhn d[v] trong ba thut ton cn li chc chn khng th khai bo l Integer c.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n3),
thut ton Dijkstra l O(n2), thut ton ti u nhn theo th t tp l O(n2) cn thut ton Floyd l
O(n3). Tuy nhin nu s dng danh sch k, thut ton ti u nhn theo th t tp s c phc
tp tnh ton l O(m). Thut ton Dijkstra kt hp vi cu trc d liu Heap c phc tp
O(max(n, m).logn).
Khc vi mt bi ton i s hay hnh hc c nhiu cch gii th ch cn nm vng mt cch cng
c th coi l t yu cu, nhng thut ton tm ng i ngn nht bc l rt r u, nhc im
trong tng trng hp c th (V d nh s nh ca th qu ln lm cho khng th biu din
bng ma trn trng s th thut ton Floyd s gp kh khn, hay thut ton Ford-Bellman lm vic
kh chm). V vy yu cu trc tin l phi hiu bn cht v thnh tho trong vic ci t tt c cc
thut ton trn c th s dng chng mt cch uyn chuyn trong tng trng hp c th. Nhng
bi tp sau y cho ta thy r iu .
Bi tp
L Minh Hong
L thuyt th
\ 71 [
2
1
3
2
L Minh Hong
L thuyt th
\ 72 [
m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i khng
qu 100).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung
6
2
1
1
5
1
2
1
MINTREE.INP
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2
MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5
L Minh Hong
L thuyt th
\ 73 [
Th hai, lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n trong T hay
khng. rng cc cnh trong T cc bc s to thnh mt rng ( th khng c chu trnh
n). Mun thm mt cnh (u, v) vo T m khng to thnh chu trnh n th (u, v) phi ni hai cy
khc nhau ca rng T, bi nu u, v thuc cng mt cy th s to thnh chu trnh n trong cy .
Ban u, ta khi to rng T gm n cy, mi cy ch gm ng mt nh, sau , mi khi xt n
cnh ni hai cy khc nhau ca rng T th ta kt np cnh vo T, ng thi hp nht hai cy
li thnh mt cy.
Nu cho mi nh v trn cy mt nhn Lab[v] l s hiu nh cha ca nh v trong cy, trong trng
hp v l gc ca mt cy th Lab[v] c gn mt gi tr m. Khi ta hon ton c th xc nh
c gc ca cy cha nh v bng hm GetRoot nh sau:
function GetRoot(vV): V;
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;
Vy kim tra mt cnh (u, v) c ni hai cy khc nhau ca rng T hay khng? ta c th kim tra
GetRoot(u) c khc GetRoot(v) hay khng, bi mi cy ch c duy nht mt gc.
hp nht cy gc r1 v cy gc r2 thnh mt cy, ta lu rng mi cy y ch dng ghi
nhn mt tp hp nh thuc cy ch cu trc cnh trn cy th no th khng quan trng. Vy
hp nht cy gc r1 v cy gc r2, ta ch vic coi r1 l nt cha ca r2 trong cy bng cch t:
Lab[r2] := r1.
r1
r1
r2
r2
u
Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin cho
hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt, th gc cy
no t nt hn s b coi l con ca gc cy kia.
Thut ton hp nht cy gc r1 v cy gc r2 c th vit nh sau:
{Count[k] l s nh ca cy gc k}
L Minh Hong
L thuyt th
\ 74 [
procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1;
{Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;
L Minh Hong
L thuyt th
\ 75 [
{Ly gc ca cy cha v}
L thuyt th
Union(r1, r2);
end;
\ 76 [
{Hp nht hai cy thnh mt cy}
end;
end;
procedure PrintResult;
var
i, Count, W: Integer;
begin
if not Connected then
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do
{Duyt danh sch cnh}
with e[i] do
begin
if Mark then
{Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn('(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break;
{Cho ti khi n - 1 cnh}
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init;
Kruskal;
PrintResult;
Close(Input);
Close(Output);
end.
L thuyt th
\ 77 [
L thuyt th
\ 78 [
Xt v phc tp tnh ton, thut ton Prim c phc tp l O(n2). Tng t thut ton Dijkstra,
nu kt hp thut ton Prim vi cu trc Heap s c mt thut ton vi phc tp
O((m+n)logn).
Bi tp
1. Vit chng trnh to th vi s nh 100, trng s cc cnh l cc s c sinh ngu nhin.
Ghi vo file d liu MINTREE.INP ng theo khun dng quy nh. So snh kt qu lm vic ca
thut ton Kruskal v thut ton Prim v tnh ng n v v tc .
2. Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (Xi, Yi). Cho php ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt
L Minh Hong
L thuyt th
\ 79 [
L Minh Hong
L thuyt th
\ 80 [
E)
u ( v )
w + ( v )
-(v) = {uV(u, v) E}
+(v) = {wV(v, w) E}
Gi tr ca mt lung l tng lung trn cc cung i ra khi nh pht = tng lung trn cc cung
i vo nh thu.
2
3
6
1
0
3
5
6
3
1
3
I. BI TON
Cho mng G = (V, E). Hy tm lung f* trong mng vi gi tr lung ln nht. Lung nh vy gi
l lung cc i trong mng v bi ton ny gi l bi ton tm lung cc i trn mng.
II. LT CT, NG TNG LUNG, NH L FORD - FULKERSON
1. nh ngha:
Ta gi lt ct (X, Y) l mt cch phn hoch tp nh V ca mng thnh hai tp ri nhau X v Y,
trong X cha nh pht v Y cha nh thu. Kh nng thng qua ca lt ct (X, Y) l tng tt c
cc kh nng thng qua ca cc cung (u, v) c u X v v Y. Lt ct vi kh nng thng qua nh
nht gi l lt ct hp nht.
2. nh l Ford-Fulkerson:
Gi tr lung cc i trn mng ng bng kh nng thng qua ca lt ct hp nht. Vic chng
minh nh l Ford- Fulkerson xy dng c mt thut ton tm lung cc i trn mng:
Gi s f l mt lung trong mng G = (V, E). T mng G = (V, E) ta xy dng th c trng s Gf
= (V, Ef) nh sau:
Xt nhng cnh e = (u, v) E (c[u, v] > 0):
L Minh Hong
L thuyt th
\ 81 [
Nu f[u, v] < c[u, v] th ta thm cung (u, v) vo Ef vi trng s c[u, v] - f[u, v], cung gi l
cung thun. V ngha, trng s cung ny cho bit cn c th tng lung f trn cung (u, v)
mt lng khng qu trng s .
Xt tip nu nh f[u, v] > 0 th ta thm cung (v, u) vo Ef vi trng s f[u, v], cung gi l
cung nghch. V ngha, trng s cung ny cho bit cn c th gim lung f trn cung (u, v)
mt lng khng qu trng s .
th Gf c gi l th tng lung.
5
6;5
6;6
5;5
3;0
3;1
3
6
6;1
5,2
3
1;1
Hnh 21: Mng v lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng
2
5;5
3;0
6;6
5;5
3;2
3;1
6
1
6;1
5,2
3
6;3
6;6
3;3
6
1
6;3
5,4
3
1;1
5
1;1
L thuyt th
\ 82 [
Bc 2: Lp hai bc sau:
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht mt du cch th hin
c cung (u, v) trong mng v kh nng thng qua ca cung l c[u, v] (c[u, v] l s nguyn
dng khng qu 100)
Output: file vn bn MAXFLOW.OUT ghi lung trn cc cung v gi tr lung cc i tm c
6
2
5
1
5
6
3
MAXFLOW.INP
6 8 1 6
1 2 5
1 3 5
2 4 6
2 5 3
3 4 3
3 5 1
4 6 6
5 6 6
MAXFLOW.OUT
f(1, 2) = 5
f(1, 3) = 4
f(2, 4) = 3
f(2, 5) = 2
f(3, 4) = 3
f(3, 5) = 1
f(4, 6) = 6
f(5, 6) = 3
Max Flow: 9
Ch rng ti mi bc c nhiu phng n chn ng tng lung, hai cch chn khc nhau c
th cho hai lung cc i khc nhau, tuy nhin v mt gi tr th tt c cc lung xy dng c
theo cch trn s c cng gi tr cc i.
Ci t chng trnh tm lung cc i di y rt chn phng, t ma trn nhng kh nng thng
qua c v lung f hin c (khi to f l lung 0), n xy dng th tng lung Gf bng cch xy
dng ma trn cf nh sau:
cf[u, v] = trng s cung (u, v) trn th Gf nu nh (u, v) l cung thun
cf[u, v] = - trng s cung (u, v) trn th Gf nu nh (u, v) l cung nghch
cf[u, v] = + nu nh (u, v) khng phi cung ca Gf
cf gn ging nh ma trn trng s ca Gf, ch c iu ta i du trng s nu nh gp cung nghch.
Cu hi t ra l nu nh mng cho c nhng ng hai chiu (c c cung (u, v) v cung (v, u) iu ny xy ra rt nhiu trong mng li giao thng) th th tng lung rt c th l a th
(gia u, v c th c nhiu cung t u ti v). Ma trn cf cng gp nhc im nh ma trn trng s:
khng th biu din c a th, tc l nu nh c nhiu cung ni t u ti v trong th tng
lung th ta nh chp nhn b bt m ch gi li mt cung. Rt may cho chng ta l iu
khng lm sai lch i mc ch xy dng th tng lung: ch l tm mt ng i t nh pht A
ti nh thu B m thi, cn ng no th khng quan trng.
Sau chng trnh tm ng i t nh pht A ti nh thu B trn th tng lung bng thut
ton tm kim theo chiu rng, nu tm c ng i th s tng lung dc theo ng tng
lung...
L Minh Hong
L thuyt th
\ 83 [
L Minh Hong
L thuyt th
\ 84 [
procedure IncFlow;
var
u, v, IncValue: Integer;
begin
{Trc ht d ng theo vt tm trng s nh nht ca cc cung trn ng}
IncValue := maxC;
v := B;
while v <> A do
begin
u := Trace[v]; { rng cf[u, v] l trng s ca cung (u, v) trn th tng lung}
if Abs(cf[u, v]) < IncValue then IncValue := Abs(cf[u, v]);
v:= u;
end;
{D li ng ln th hai, ln ny tng lung}
v := B;
while v <> A do
begin
u := Trace[v];
if cf[u, v] > 0 then f[u, v] := f[u, v] + IncValue {Nu (u, v) l cung thun trn Gf}
else f[v, u] := f[v, u] - IncValue; {Nu (u, v) l cung nghch trn Gf}
v := u;
end;
end;
procedure PrintResult; {In lung cc i tm c}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu c cung (u, v) trn mng th in ra gi tr lung f gn cho cung }
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v]; {Gi tr lung cc i = tng lung pht ra t A}
end;
WriteLn('Max Flow: ', m);
end;
begin
Assign(Input, 'MAXFLOW.INP'); Reset(Input);
Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter;
{Nhp d liu}
FillChar(f, SizeOf(f), 0); {Khi to lung 0}
repeat
{Bc lp}
CreateGf;
{Dng th tng lung}
if not FindPath then Break; {Nu khng tm c ng tng lung th thot ngay}
IncFlow;
{Tng lung dc ng tng lung}
until False;
PrintResult;
Close(Input);
Close(Output);
end.
L thuyt th
\ 85 [
L Minh Hong
L thuyt th
\ 86 [
Delta[A] := maxC;
{Khi to nhn}
repeat
u := Queue[First]; Inc(First);
{Ly u khi Queue}
for v := 1 to n do
if Trace[v] = 0 then
{Xt nhng nh v cha nh du thm}
begin
if f[u, v] < c[u, v] then
{Nu (u, v) l cung thun trn Gf v c trng s l c[u, v] - f[u, v]}
begin
Trace[v] := u;
{Lu vt, Trace[v] mang du dng}
Delta[v] := min(Delta[u], c[u, v] - f[u, v]);
end
else
if f[v, u] > 0 then
{Nu (u, v) l cung nghch trn Gf v c trng s l f[v, u]}
begin
Trace[v] := -u;
{Lu vt, Trace[v] mang du m}
Delta[v] := min(Delta[u], f[v, u]);
end;
if Trace[v] <> 0 then
{Trace[v] khc 0 tc l t u c th thm v}
begin
if v = B then
{C ng tng lung t A ti B}
begin
FindPath := True; Exit;
end;
Inc(Last); Queue[Last] := v; {a v vo Queue}
end;
end;
until First > Last;
{Hng i Queue rng}
FindPath := False;
{ trn khng Exit c tc l khng c ng}
end;
procedure IncFlow; {Tng lung dc ng tng lung}
var
IncValue, u, v: Integer;
begin
IncValue := Delta[B];
{Nhn Delta[B] chnh l trng s nh nht trn cc cung ca ng tng lung}
v := B;
{Truy vt ng i, tng lung dc theo ng i}
repeat
u := Trace[v];
{Xt cung (u, v) trn ng tng lung}
if u > 0 then f[u, v] := f[u, v] + IncValue
{(|u|, v) l cung thun th tng f[u, v]}
else
begin
u := -u;
f[v, u] := f[v, u] - IncValue;
{(|u|, v) l cung nghch th gim f[v, |u|]}
end;
v := u;
until v = A;
end;
procedure PrintResult;
{In kt qu}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v];
end;
WriteLn('Max Flow: ', m);
end;
begin
L Minh Hong
L thuyt th
\ 87 [
L Minh Hong
L thuyt th
\ 88 [
L Minh Hong
L thuyt th
\ 89 [
th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn nhn gia tp nhng
ngi n ng v tp nhng ngi n b, vic sinh vin chn trng, thy gio chn tit dy trong
thi kho biu v.v...
II. BI TON GHP I KHNG TRNG V CC KHI NIM
Cho mt th hai pha G = (XY, E) y X l tp cc nh tri v Y l tp cc nh phi ca G
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.
Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln nht)
ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Nu nh hng li cc cnh ca th thnh cung, nhng cnh cha ghp c nh hng t X
sang Y, nhng cnh ghp nh hng t Y v X. Trn th nh hng : Mt ng i xut
pht t mt X_nh cha ghp gi l ng pha, mt ng i t mt X_nh cha ghp ti mt
Y_nh cha ghp gi l ng m.
Mt cch d hiu, c th quan nim nh sau:
Mt ng pha (alternating path) l mt ng i n trong G bt u bng mt X_nh cha
ghp, i theo mt cnh cha ghp sang Y, ri n mt cnh ghp v X, ri li n mt cnh
cha ghp sang Y... c xen k nhau nh vy.
Mt ng m (augmenting path) l mt ng pha. Bt u t mt X_nh cha ghp kt
thc bng mt Y_nh cha ghp.
L Minh Hong
L thuyt th
\ 90 [
X1
Y1
X2
Y2
X3
Y3
mt b ghp M>;
ng m xut pht t x ti mt nh y cha ghp Y> do
trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh
ghp, nh x v y tr thnh ghp, s cnh ghp tng ln 1>;
L thuyt th
\ 91 [
3. Tm ng m nh th no.
V ng m bt u t mt X_nh cha ghp, i theo mt cnh cha ghp sang tp Y, ri theo
mt ghp v tp X, ri li mt cnh cha ghp sang tp Y ... cui cng l cnh cha ghp ti
mt Y_nh cha ghp. Nn c th thy ngay rng di ng m l l v trn ng m s cnh
M t hn s cnh M l 1 cnh. V cng d thy rng gii thut tm ng m nn s dng thut
ton tm kim theo chiu rng ng m tm c l ng i ngn nht, gim bt cng vic
cho bc tng cp ghp.
Ta khi to mt hng i (Queue) ban u cha tt c cc X_nh cha ghp. Thut ton tm kim
theo chiu rng lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t
v cha c thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc
Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh j Y ghp,
da vo s kin: t j ch c th ti c matchY[j] theo duy nht mt cnh ghp nh hng
ngc t Y v X, nn ta c th nh du thm j, thm lun c matchY[j], v y vo Queue
phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP
Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t nht
mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c cnh ni
hai nh (X[i], Y[j]) .
Output: file vn bn MATCH.OUT cha b ghp cc i tm c
2
5
MATCH.INP
4 5
1 1
1 4
2 1
2 2
2 4
3 2
3 3
4 2
4 3
MATCH.OUT
Match:
1) X[1] 2) X[2] 3) X[3] 4) X[4] -
Y[1]
Y[4]
Y[3]
Y[2]
L thuyt th
\ 92 [
first := 1;
while first <= last do
begin
i := Queue[first]; Inc(first); {Ly mt X_nh ra khi Queue (X[i])}
for j := 1 to n do
{Xt nhng Y_nh cha thm k vi X[i] qua mt cnh cha ghp}
if (Trace[j] = 0) and a[i, j] and (matchX[i] <> j) then
begin {lnh if trn hi tha k matchX[i] <> j, iu kin Trace[j] = 0 bao hm lun iu kin ny ri}
Trace[j] := i;
{Lu vt ng i}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ng m v thot ngay}
begin
FindAugmentingPath := j;
Exit;
end;
Inc(last);
{y lun matchY[j] vo hng i}
Queue[last] := matchY[j];
end;
end;
FindAugmentingPath := 0; { trn khng Exit c tc l khng cn ng m}
end;
{Ni rng b ghp bng ng m kt thc fY}
{Thut ton ng m}
next
... ...
next
... ...
L thuyt th
\ 93 [
finish: Integer;
begin
repeat
finish := FindAugmentingPath;
{u tin th tm mt ng m}
if finish <> 0 then Enlarge(finish);
{Nu thy th tng cp v lp li}
until finish = 0;
{Nu khng thy th dng}
end;
procedure PrintResult;
{In kt qu}
var
i, Count: Integer;
begin
WriteLn('Match: ');
Count := 0;
for i := 1 to m do
if matchX[i] <> 0 then
begin
Inc(Count);
WriteLn(Count, ') X[', i, '] - Y[', matchX[i], ']');
end;
end;
begin
Assign(Input, 'MATCH.INP'); Reset(Input);
Assign(Output, 'MATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
PrintResult;
Close(Input);
Close(Output);
end.
L thuyt th
\ 94 [
L Minh Hong
L thuyt th
\ 95 [
y l mt dng bi ton pht biu nh sau: C m ngi (nh s 1, 2, ..., m) v n cng vic
(nh s 1, 2, ..., n), mi ngi c kh nng thc hin mt s cng vic no . giao cho
ngi i thc hin cng vic j cn mt chi ph l c[i, j] 0. Cn phn cho mi th mt vic v
mi vic ch do mt th thc hin sao cho s cng vic c th thc hin c l nhiu nht v
nu c 2 phng n u thc hin c nhiu cng vic nht th ch ra phng n chi ph t
nht.
Dng th hai pha G = (XY, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi
trng s c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu
cnh nht ca G c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X=Y= k.
Gi M l mt s dng ln hn chi ph ca mi php phn cng c th. Vi mi cp nh
(u, v): u X v v Y. Nu (u, v) E th ta b sung cnh (u, v) vo E vi trng s l M.
Khi ta c G l mt th hai pha y ( th hai pha m gia mt nh bt k ca
X v mt nh bt k ca Y u c cnh ni). V nu nh ta tm c b ghp y k
cnh mang trng s nh nht th ta ch cn loi b khi b ghp nhng cnh mang
trng s M va thm vo th s c k hoch phn cng 1 ngi 1 vic cn tm. iu
ny d hiu bi b ghp y mang trng s nh nht tc l phi t cnh trng s M nht,
tc l s php phn cng l nhiu nht, v tt nhin trong s cc phng n ghp t cnh trng
s M nht th y l phng n trng s nh nht, tc l tng chi ph trn cc php phn cng
l t nht.
L Minh Hong
L thuyt th
\ 96 [
-1
-1
0 0 0
0 1 7
0 8 9
1 0 0
0 0 6
0 7 8
X[1] - Y[3]
X[2] - Y[2]
X[3] - Y[1]
+1
Mt b ghp M :=
Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau.
L Minh Hong
L thuyt th
\ 97 [
V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh khng
v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng cnh nt m
l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.
L Minh Hong
L thuyt th
\ 98 [
X1
Y1
x* = X1
X1
Y1
Tm c ng m:
X2
Y2
2
X1 Y1
X2
Y2
2
1
X3
1
Y3
X4
X1
Tng cp
Y4
Y1
X3
Y3
X4
x* = X2
X1
Y4
Y1
Tm c ng m:
X2
Y2
2
X2 Y1 X1 Y2
X2
Y2
2
1
X3
1
Y3
X4
X1
Tng cp
Y4
Y1
X3
Y3
X4
x* = X3
X1
Y4
Y1
Tm c ng m:
X2
Y2
2
X3 Y3
X2
Y2
2
1
X3
1
Y3
X4
X1
Y4
Y1
X2
Y2
2
1=
X3
X4
L Minh Hong
Y3
Tng cp
Y4
X3
Y3
X4
x* = X4
Khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha: {X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha: {Y3}
Gi tr xoay = 1 (Cnh X3-Y2)
Tr tt c trng s nhng cnh lin
thuc vi {X3, X4} i 1
Cng tt c trng s nhng cnh lin
thuc vi Y3 ln 1
X1
Y4
Y1
X2
Y2
2
0
X3
X4
Y3
Y4
L thuyt th
\ 99 [
X1
Y1
X2
Y2
2=
X3
Y3
X4
X1
Y4
Y1
x* = X4
Vn khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha:
{X1, X2, X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha:
{Y1, Y2, Y3}
Gi tr xoay = 2 (Cnh X2-Y4)
Tr tt c trng s nhng cnh lin
thuc vi {X1, X2, X3, X4} i 2
Cng tt c trng s nhng cnh lin
thuc vi {Y1, Y2, Y3} ln 2
x* = X4
X1
Y1
X2
Y2
0
X3
X4
Y3
Y4
X1
Y1
X2
Y2
X3
Y3
Tm c ng m:
X2
Y2
0
X3
Y3
X4 Y3 X3 Y2 X1 Y1
X2 Y4
Tng cp
Xong
X4
Y4
X4
Y4
L Minh Hong
L thuyt th
\ 100 [
Tp cc cnh (X[i], Y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k
cnh, y chnh l b ghp cn tm.
Chng minh:
Nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh X[i], tr tt c trng s ca nhng cnh lin thuc vi X[i] i Fx[i]
Vi mi nh Y[j], tr tt c trng s ca nhng cnh lin thuc vi Y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (X[i], Y[j]) i mt lng
Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
1
2
3
4
0
0
M
M
Fx[1] = 2
1
2
0
M
M
2
Fx[2] = 2
3
M
1
0
M
Fx[3] = 3
4
M
M
0
9
Fx[4] = 3
Fy[1] = -2 Fy[2] = -2 Fy[3] = -3 Fy[4] = 0
(C nhiu phng n khc: Fx = (0, 0, 1, 1); Fy = (0, 0, -1, 2) cng ng)
1i k
L Minh Hong
L thuyt th
\ 101 [
Dng 1: Ghi hai s m, n theo th t l s th v s vic cch nhau 1 du cch (m, n 100)
Cc dng tip theo, mi dng ghi ba s i, j, c[i, j] cch nhau 1 du cch th hin th i lm c
vic j v chi ph lm l c[i, j] (1 i m; 1 j n; 0 c[i, j] 100).
L Minh Hong
L thuyt th
\ 102 [
Y
6
ASSIGN.INP
5 6
1 1 0
1 2 0
2 1 0
2 4 2
3 2 1
3 3 0
4 3 0
4 4 9
5 4 9
ASSIGN.OUT
Optimal assignment:
1) X[1] - Y[1]
2) X[2] - Y[4]
3) X[3] - Y[2]
4) X[4] - Y[3]
Cost: 3
0
2
1
0
19
5
{Khi to}
{B ghp rng}
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
{Fy[j] := Trng s nh nht ca cc cnh lin thuc vi Y[j]}
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do {Lu l trng s cnh (x[i], y[j]) by gi l c[i, j] - Fx[i] ch khng cn l c[i, j] na}
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
{Vic khi to cc Fx v Fy nh th ny ch n gin l cho s 0_cnh tr nn cng nhiu cng tt m thi}
{Ta hon ton c th khi gn cc Fx v Fy bng gi tr 0}
L Minh Hong
L thuyt th
\ 103 [
end;
{Hm cho bit trng s cnh (X[i], Y[j]) }
Queue[1] := start;
{y start vo hng i}
first := 1; last := 1;
repeat
i := Queue[first]; Inc(first); {Ly mt nh X[i] khi hng i}
for j := 1 to k do
{Duyt nhng Y_nh cha thm k vi X[i] qua mt 0_cnh cha ghp}
if (Trace[j] = 0) and (GetC(i, j) = 0) then
begin
Trace[j] := i;
{Lu vt ng i, cng vi vic nh du (0) lun}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ni kt thc ng m v thot lun}
begin
finish := j;
Exit;
end;
Inc(last); Queue[last] := matchY[j]; {y lun matchY[j] vo Queue}
end;
until first > last;
{Hng i rng}
end;
procedure SubX_AddY;
{Xoay cc trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
(* rng:
VisitedY = {y | Trace[y] 0}
VisitedX = {start} match(VisitedY) = {start} {matchY[y] | Trace[y] 0}
*)
VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;
{Sau khi xc nh c VisitedX v VisitedY, ta tm l trng s nh nht ca cnh ni t VisitedX ra Y\VisitedY}
Delta := maxC;
for i := 1 to k do
if i in VisitedX then
for j := 1 to k do
if not (j in VisitedY) and (GetC(i, j) < Delta) then
Delta := GetC(i, j);
{Xoay trng s cnh}
for t := 1 to k do
begin
{Tr trng s nhng cnh lin thuc vi VisitedX i Delta}
L Minh Hong
L thuyt th
\ 104 [
end;
{Ni rng b ghp bi ng m tm c}
procedure Enlarge;
var
x, next: Integer;
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;
finish
finish
next
next
... ...
... ...
start
start
procedure Solve;
{Thut ton Hungari}
var
x, y: Integer;
begin
for x := 1 to k do
begin
start := x; finish := 0; {Khi gn ni xut pht ng m, finish = 0 ngha l cha tm thy ng m}
repeat
FindAugmentingPath;
{Th tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh v lp li}
until finish <> 0;
{Cho ti khi tm thy ng m}
Enlarge;
{Tng cp da trn ng m tm c}
end;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {In ra php phn cng th ch cn xt n m, khng cn xt n k}
begin
y := matchX[x];
{Nhng cnh c trng s maxC tng ng vi mt th khng c giao vic v mt vic khng c phn cng}
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
Nhn xt:
1.
Nu ci t nh trn th cho d th c cnh mang trng s m, chng trnh vn tm c
b ghp cc i vi trng s cc tiu. L do: Ban u, ta tr tt c cc phn t trn mi hng
L Minh Hong
L thuyt th
2.
3.
\ 105 [
M := ;
L Minh Hong
L thuyt th
\ 106 [
x*
y1 +
x1
+ y2
x2
y1
y2
x1
x2
y3
x3 -
y4 +
y5 +
y7
y3
y4
y5
y7
X4 -
X5 -
X7
x3
X4
X5
X7
y6
y6
Augmenting path found
Nhn xt 2:
Vic xc nh trng s nh nht ca cnh ni mt X_nh trong cy pha vi mt Y_nh ngoi cy
pha c th kt hp ngay trong bc dng cy pha m khng lm tng cp phc tp tnh ton.
thc hin iu ny, ta s dng k thut nh trong thut ton Prim:
Vi mi yY, gi d[y] := khong cch t y n cy pha gc x*. Ban u d[y] c khi to bng
trng s cnh (x*, y) = c[x*, y] - Fx[x*] - Fy[y] (cy pha ban u ch c ng mt nh x*).
Trong bc tm ng bng BFS, mi ln rt mt nh x ra khi Queue, ta xt nhng nh yY
cha thm v t li d[y]mi := min(d[y]c, trng s cnh (x, y)) sau mi kim tra xem (x, y) c
phi l 0_cnh hay khng tip tc cc thao tc nh trc. Nu qu trnh BFS khng tm ra ng
m th gi tr xoay chnh l gi tr nh nht trong cc d[y] dng. Ta bt c mt on chng
trnh tm gi tr xoay c phc tp O(k2). Cng vic ti mi bc xoay ch l tm gi tr nh nht
trong cc d[y] dng v thc hin php cng, tr trn hai dy i ngu Fx v Fy, n c phc tp
tnh ton O(k), ti a c k ln xoay tm ng m nn tng chi ph thi gian thc hin cc ln
xoay cho ti khi tm ra ng m c O(k2). Lu rng th ang xt l th hai pha y nn
sau khi xoay cc trng s cnh bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti
L Minh Hong
L thuyt th
\ 107 [
L thuyt th
\ 108 [
end;
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
end;
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS;
var
y: Integer;
begin
first := 1; last := 1;
Queue[1] := start;
{Khi to cc Y_nh u cha thm Trace[y] = 0, y}
for y := 1 to k do
begin
d[y] := GetC(start, y);
arg[y] := start;
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(last); Queue[last] := v;
end;
{y mt nh vX vo hng i}
L thuyt th
\ 109 [
d[j] := w;
arg[j] := i;
end;
end;
until first > last;
end;
{Xoay cc trng s cnh}
procedure SubX_AddY;
var
Delta: Integer;
x, y: Integer;
begin
{Trc ht tnh = gi tr nh nht trng s cc d[y], vi yY cha thm (y khng thuc cy pha)}
Delta := maxC;
for y := 1 to k do
if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y];
{Tr trng s nhng cnh lin thuc vi startX i }
for y := 1 to k do
if (Trace[y] = 0) and (d[y] = 0) then {Thm lun nhng nh yY to vi cy pha mt 0_cnh}
begin
Trace[y] := arg[y];
{Lu vt ng i}
if matchY[y] = 0 then
{Nu y cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
finish := y;
Exit;
end;
Push(matchY[y]);
{Nu y ghp th y lun matchY[y] vo hng i ch loang tip}
end;
end;
procedure Enlarge;
{Ni rng b ghp bng ng m kt thc finish}
var
x
finish
x, next: Integer;
begin
next
repeat
x := Trace[finish];
... ...
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
start
until finish = 0;
end;
procedure Solve;
var
x, y: Integer;
begin
for x := 1 to k do
{Vi mi X_nh: }
begin
start := x;
{t ni khi u ng m}
InitBFS;
{Khi to cy pha}
repeat
L Minh Hong
finish
next
... ...
start
L thuyt th
FindAugmentingPath;
{Tm ng m}
if finish = 0 then SubX_AddY;
{Nu khng thy th xoay cc trng s cnh ...}
until finish <> 0;
{Cho ti khi tm ra ng m}
Enlarge;
{Ni rng b ghp bi ng m tm c}
end;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do
{Vi mi X_nh, xt cp ghp tng ng}
begin
y := matchX[x];
if c[x, y] < maxC then
{Ch quan tm n nhng cp ghp c trng s < maxC}
begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong
\ 110 [
L thuyt th
\ 111 [
matched edge
unmatched edge
ng (8, 1, 2, 5, 6, 4) l mt ng pha
Chu trnh (2, 3, 4, 6, 5, 2) l mt Blossom
ng (8, 1, 2, 3, 4, 6, 5, 7) l mt ng m
ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy c cc cnh m/nht xen k nhng khng phi ng pha
(v tt nhin khng phi ng m) v y khng phi l ng i c bn.
Ta d dng suy ra c cc tnh cht sau
ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s cnh m
ng 1 cnh.
Trong mi Blossom, nhng nh khng phi nh c s u l nh ghp v nh ghp vi
nh cng phi thuc Blossom.
V Blossom l mt chu trnh nn trong mi Blossom, nhng nh khng phi nh c s u tn
ti hai ng pha t nh c s i n n, mt ng kt thc bng cnh m v mt ng kt
thc bng cnh nht, hai ng pha ny c hnh thnh bng cch i dc theo chu trnh theo
hai hng ngc nhau. Nh v d trn, nh 4 c hai ng pha i nh c s 2 i ti: (2, 3, 4)
l ng pha kt thc bng cnh m v (2, 5, 6, 4) l ng pha kt thc bng cnh nht
L Minh Hong
L thuyt th
\ 112 [
iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht t
mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm kim trn
th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x bng
mt ng pha kt thc l cnh nht c gn nhn "nht", nhng nh c th n c t x bng
mt ng pha kt thc l cnh m c gn nhn "m".
Vi mt Blossom, ta nh ngha php chp (shrink) l php thay th cc nh trong Blossom bng
mt nh duy nht. Nhng cnh ni gia mt nh thuc Blossom ti mt nh v no khng
thuc Blossom c thay th bng cnh ni gia nh chp ny vi v v gi nguyn tnh m/nht.
D thy rng sau mi php chp, cc cnh m vn c m bo l b ghp trn th mi:
*
Shrink
Shrink
blossom
blossom
L Minh Hong
L thuyt th
\ 113 [
expand
expand
blossom
blossom
Lu rng khng phi Blossom no cng b chp, ch nhng Blossom nh hng ti qu trnh tm
ng m mi phi chp m bo rng ng m tm c l ng i c bn. Tuy nhin vic
ci t trc tip cc php chp Blossom v n nh kh rc ri, i hi mt chng trnh vi
phc tp O(n4).
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n3), phng php
ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.
III. PHNG PHP LAWLER (1973)
Trong phng php Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton li
c th nm trn mt Blossom mi v b chp tip. Phng php Lawler ch quan tm n nh chp
cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui cng ny c
nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi mt
Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu trnh pha
c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti v,
mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai loi vt
gn cho mi nh v:
S[v] l nh lin trc v trn ng pha kt thc bng cnh m, nu khng tn ti ng pha
loi ny th S[v] = 0.
T[v] l nh lin trc v trn ng pha kt thc bng cnh nht, nu khng tn ti ng pha
loi ny th T[v] = 0.
Bn cnh hai nhn S v T, mi nh v cn c thm
Nhn b[v] l nh c s ca Blossom cha v. Hai nh u v v thuc cng mt Blossom b[u]
= b[v].
Nhn match[v] l nh ghp vi nh v. Nu v cha ghp th match[v] = 0.
L Minh Hong
L thuyt th
\ 114 [
v=4
T:1
L Minh Hong
T:3
u=3
v=4
2
T:1
Tm thy ng m
S:2
L thuyt th
\ 115 [
S:2
u=3
v=4
S:2
T:3
S:4
u=3
v=4
T:1
T:1
T:1
S:2
T:3
S:5
T:7
S:4
u=4
v=7
T:3
S:7
T:5
S:6
b=3
S:4
T:3
S:5
T:7
S:4
u=5
u=5
a
x
T:1
S:2
T:1
S:2
v=7
v=7
T:3
S:6
T:3
S:7
T:5
S:6
b=3
T tng chnh ca phng php Lawler l dng cc nhn b[v] thay cho thao tc chp trc tip
Blossom, dng cc nhn S v T truy vt tm ng m, trnh thao tc n Blossom. Phng php
ny da trn mt nhn xt: Mi khi tm ra ng m, nu ng m xuyn qua mt Blossom
ngoi nht th chc chn n phi i vo Blossom ny t nt c s v thot ra khi Blossom bng
mt cnh nht.
IV. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt du
cch (n 100)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th
L Minh Hong
L thuyt th
\ 116 [
10
GMATCH.INP
10 11
1 2
1 6
2 4
2 8
3 4
3 6
5 6
5 9
5 10
7 8
7 9
GMATCH.OUT
1 6
2 8
3 4
5 10
7 9
Number of matched edges: 5
L thuyt th
\ 117 [
begin
FillChar(match, SizeOf(match), 0);
end;
procedure InitBFS; {Th tc ny c gi khi to trc khi tm ng m xut pht t start}
var
i: Integer;
begin
{Hng i ch gm mt nh m start}
first := 1; last := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}
for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;
procedure Push(v: Integer);
begin
Inc(last);
Queue[last] := v;
InQueue[v] := True;
end;
{y mt nh m v vo hng i}
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht nt hai nh m p, q}
L thuyt th
\ 118 [
{Gn li nhn}
ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] nu blossom b[i] b nh du}
for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt tip ti cc bc sau}
for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;
{Th tc tm ng m}
procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat
{BFS}
u := Pop;
{Xt nhng nh v cha duyt, k vi u, khng nm cng Blossom vi u, d nhin T[v] = 0 th (u, v) l cnh nht ri}
for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then
{Nu v cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nu v l nh m th gn li vt, chp Blossom ...}
L thuyt th
\ 119 [
match[finish] := v;
finish := next;
until finish = 0;
end;
procedure Solve;
{Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u;
{Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;
procedure Result;
{In b ghp tm c}
var
u, count: Integer;
begin
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh s trng lp (u, v) v (v, u), va loi nhng nh khng ghp c (match=0)}
begin
Inc(count);
WriteLn(u, ' ', match[u]);
end;
WriteLn('Number of matched edges: ', count);
end;
begin
Assign(Input, 'GMATCH.INP'); Reset(Input);
Assign(Output, 'GMATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong