Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 36

IV.

Tnh lin thng ca th

1. nh ngha
a. th v hng
G=(V,E) gi l lin thng nu lun tn ti ng i gia mi
cp nh phn bit ca th. th ch gm mt nh cngc
coi l th lin thng.
Nu G khng lin thng th chc chn n s l hp ca hai hay
nhiu th con1 lin thng, cc th con ny i mt khng c
nh chung. Cc th con lin thng ri nhau nh vy c gi
l cc thnh phn lin thng ca th ang xt (Xem v d bn).

1. nh ngha
a. th v hng
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 hay im
khp. 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 mt cnh ct hay mt cu.

1. nh ngha
b. 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 nu lun tn ti ng i (theo cc
cung nh hng) gia hai nh bt k ca th, g gi l lin
thng yu nu th v hng nn ca n l lin thng

2. Xc nh thnh phn lin thng th v hng


a. Kim tra tnh lin thng
Ta c th dng phng php duyt theo chiu rng hoc theo
chiu su kim tra tnh lin thng ca G.
Nu duyt theo chiu rng th: G lin thng khi v ch khi
xut pht t nh 1, sau khi duyt th n nh u nm trong
queue.
Duyt theo chiu su: G lin thng khi xut pht t nh 1 c
th nh du thm cho tt c cc nh.

2. Xc nh thnh phn lin thng th v hng


b. thut ton 1 cc thnh phn lt
Thut ton: lit k cc thnh phn lin thng ca G phng
php c bn nht l:
nh du nh 1 v nhng nh c th n t 1, thng bo
nhng nh thuc thnh phn lin thng th nht.
Nu tt c cc nh u b nh du th G l th lin
thng, nu khng th s tn ti mt nh v no cha b
nh du, ta s nh du v v cc nh c th n c t v,
thng bo nhng nh thuc thnh phn lin thng th hai.
V c tip tc nh vy cho ti khi tt c cc nh u b
nh du
procedure Duyt(u)
Begin <BFS hoc DFS > End;

2. Xc nh thnh phn lin thng th v hng


a. thut ton 1 cc thnh phn lt
Begin //chng trnh chnh
for v V do <khi to v cha nh du>;
Count := 0;
for u V do
if <u cha nh du> then
begin
Count := Count + 1;
Writeln('Thnh phn lin thng th ', Count, ' gm cc nh
: ');
Duyt(u);
end;
end.

2. Xc nh thnh phn lin thng th v hng


b. thut ton 2
+ Thut ton 2: s dng thut ton Warshall
- Bao ng th:
Vi th v hng G=(V,E), ngi ta xy dng th cng
gm cc nh V ca G cn tp cc cnh c xy dng nh
sau:
Gia hai nh u,v cua G c ng ni th hai cnh u,v ca c
ng i.
c gi l bao ng ca th.

2. Xc nh thnh phn lin thng th v hng


b. thut ton 2
Thut ton xy dng :
Gs th v hng G=(V,E) c n nh nh s t 1 ti n, xt tt
c cc nh k thuc V, vi mi nh k xt tip cc cp nh (i,j):
nu c cnh (i,k) v cnh (k,j) th ta ni thm cnh (i,j).
Nh vy, thut ton Warshall yu cu th phi c biu din
bng ma trn k logic A={aij}
Khi ta c thut ton xy dng bao ng ca G nh sau:
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])

2. Xc nh thnh phn lin thng th v hng


b. thut ton 2
Ta lit k cc thnh phn lin thng nh sau:
For u:=1 to n do avail[u]:=true; //khi to cc nh ban u u c kh nng
Count:=0;
For u:=1 to n do
If avail[u] then begin //lit k cc tplt cha u
Count:=Count+1;
Writeln( TpLt , Count,: ,u)
For v:=1 to n do
If A[u,v] then begin
Write(, ,v); avail[v]:=false;
End;
Writeln;
End;

3.Xc nh thnh phn lin thng th c hng


a. Kim tra tnh lin thng.

Vi th c hng G = <V, E> kim tra G


c lin thng mnh hay khng ta lm phng php
sau.
Kim tra xem t 1 c i n c tt c cc
nh hay khng?
Kim tra xem t mt nh i bt k c i v
c nh 1 hay khng.

3.Xc nh thnh phn lin thng th c hng


a. Kim tra tnh lin thng.
Bc 1. Duyt th ti nh 1. Nu t 1 c th i n
c mi nh (queue cha n nh nu duyt BFS hoc
mi nh u c thm nu duyt DFS) th chuyn sang
bc 2. Nu t 1 khng i n mi nh th kt lun l
khng phi lin thng mnh.
Bc 2. Duyt th ti nh 1 vi ma trn nghch o
( th o hng) ca A. Nu t 1 i c n mi nh
cn li ca thi th kt lun th lin thng mnh,
ngc li khng lin thng mnh.

3.Xc nh thnh phn lin thng th c hng


* Minh ha

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th

Ma trn k

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th

Ma trn o chiu

phc tp O(n2)

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
Danh sch k
5
250
30
adj 1 2 3 5 7 6 7 8
0
1230
2 5 3 1 2 3 3
30
Head 1 2 3 4 5 6
1 3 5 5 7 8
phc tp O(n+m) hoc Max(n,m)

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
File d liu cho dng danh sch cung (cnh):
Dng 1
57
12
15
23
41
42
43
53

Dng 2
57
12
15
23
43
53
41
42

Chn cch biu din th, phc tp?

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
File d liu cho dng danh sch cung (cnh):
Dng 1
57
12
15
23
41
42
43
53

Dng 2
57
12
15
43
53
42
23
41

=>Biu din th bng danh sch lin thuc


=> phc tp l tuyn tnh O(Max(n,m))

3.Xc nh thnh phn lin thng th c hng


* Ci t v s dng danh sch lin thuc:
Gs th c hng G=(V,E) c n nh v m cnh (n<105,m<106),
v danh sch m cung (u,v)
nh ngha kiu bn ghi biu din cung
Type
Edge=record
x,y: longint; //hng x->y
End;
Var e:array[1..Maxm] of Edge; //(e[i].x, e[i].y)=cung
Hoc c th dng 2 mng 1 chiu x,y cha 2 u mt ca cung
Var x,y:array[1..Maxm] of longint; //(x[i],y[i])=cung

3.Xc nh thnh phn lin thng th c hng


* Ci t v s dng danh sch lin thuc:
Mi nh u s c cho tng ng vi cc cung i ra
khi u, nh vy mi cung ch xut hin trong mt ds lin
thuc, cc cung c lu trong mng e[1..m], nn ds lin
thuc c xy dng bi hai mng:
head:array[1..maxN] of longint; vi head[u] l ch s
cung u tin trong danh sch lin thuc ca nh u. Nu
ds lin thuc nh u rng th head[u]:=0.
link:array[1..maxM] of longint; vi link[i] l ch s
cung k tip cung e[i] trong ds lin thuc cha cung e[i].
Nu e[i] l cung cui cng th link[i]:=0.

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
File d liu cho dng danh sch cung (cnh):
Dng 1
57
12
15
23
41
42
43
53

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
File d liu cho dng danh sch cung (cnh):

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
Nhp d liu cho danh sch lin thuc
Readln(f,n,m);
For i:=1 to m do readln(f,e[i].x,e[i].y); //nhp ds cung
//khi to ds lin thuc rng
For u:=1 to n do head[u]:=0;
//xy dng ds lin thuc
For i:=m downto 1 do begin
For i:=m downto 1 do
Link[i]:=head[e[i].x];
with e[i] do begin
Head[e[i].x]:=i;
End;
Link[i]:=head[x];

Head[x]:=i;

3.Xc nh thnh phn lin thng th c hng


* Nhn xt v cc cch biu din th
Duyt cc cung i ra t nh u (cc nh k vi u)

i:=head[u];
While i<>0 do begin
v:=e[i].y;//ly nh k vi u,
Hoc x l cung e[i]
i:=link[i]; //chuyn n cung tip theo i ra t u
End;

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
Bi ton vi khun dng input/output (sgk169)

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan

N nh cht: nh cht r l nh thuc cy


con DFS gc r, khng c ng quay li cc nh
thm trc r (cn gi l tin bi ca r) trong
cy DFS
Duyt n (nh u): bt u gi DFS(u)
Duyt xong (nh u): chun b thot khi th tc
DFS(u), li v nh trc u
Cung ngc, cung xui, cung cho (sgk170)

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
1

1
5

th G

Cy DFS gc 1
Th t duyt n 1 2 3 4 5 6 7
Th t duyt xong 4 3 2 7 6 5 1

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan

Thut ton Tarjan c th pht biu nh sau:


Chn r l cht khng l tin bi ca mt cht no
khc, chn ly thnh phn lin thng mnh th
nht l nhnh DFS gc r. Sau loi b nhnh
DFS gc r ra khi cy DFS, li tm thy mt cht
khc m nhnh DFS gc khng cha cht no
khc, li chn ly thnh 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

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
Vic s kim tra nh r 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 r ti mt nh thm trc r
hay khng?.
Thc hin bng cch nh s th t cc nh theo th
t duyt n. Gi Number[u] l s th t ca nh u theo
cch nh s v mng Low[u] l gi tr s th t nh
nht trong cc nh c th n c t mt nh v no
ca nhnh DFS gc u bng mt cung.
Khi duyt xong nh u, nu low[u]>=number[u] th u
l cht.

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
C th cch tnh Low[u] nh sau:
Khi xt cc nh v ni t u, c hai kh nng:
- Nu v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u]:=min(Low[u], Number[v])

2,v

4,u

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
2,u

3,v

- Nu v cha thm th ta gi quy thm v, sau cc


tiu ho Low[u] theo cng thc:
Low[u]:=min(Low[u], Low[v])
Khi duyt xong mt nh u (chun b thot khi th tc
DFS(u)), ta so snh Low[u]Number[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 chnh l
nhnh DFS gc u.

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan

Tch thnh phn lin thng mnh: Ta nh ngha


mt Stack ly ra cc nh thuc mt nhnh no
. Khi duyt n mt nh u, ta y ngay nh u
vo Stack, th khi duyt xong nh u, mi nh
thuc nhnh DFS gc u s c y vo Stack
ngay sau u. Nu u l cht, ta ch vic ly cc nh
ra khi Stack cho ti khi ly ti nh u l s c
nhnh DFS gc u, cng chnh l thnh phn lin
thng mnh cha u.

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
M hnh thut ton Tarjan
procedure DFSVisit(u);
begin
id := id + 1; Number[u] := id;
Low[u] := id; Push(u);
for v_V:(u, v)_E do
if avail[v] then
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;

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
//duyt xong u
if Low[u] Number[u] then //Nu u l cht
begin //Thng bo thnh phn lin thng mnh vi cht u
Inc(count); writeln(TP/lT,count);
repeat
v := Pop; Output v;
//Xo nh v khi th: V := V - {v};
Avail[v]:=false
until v = u;
end;
end;
begin //CT chnh
Count := 0; Stack := rng; id:=0;
for v thucV do Number[v] := 0; //Number[v] = 0 v cha thm
for v thuc V do if Avail[v] then DFSVisit(v);
end.

3.Xc nh thnh phn lin thng th c hng


b. Thut ton Tarjan
Cu trc d liu:

type edge=record x,y:longint; end;


var
e:array[1..maxM] of edge; //list of edege
head:array[1..maxN] of longint;// head[u]:the first position (u,v) in e[.]
link:array[1..maxM] of longint;//link[i]: the next position edge i in e[.]
number:array[1..maxN] of longint; //number[u]: order to visit u
low:array[1..maxN] of longint; //low[u]: min(number[v]) to visit u
s:array[1..maxN] of longint; //connect component...
avail:array[1..maxN] of boolean;//mark vertex
n,m,count,id,top:longint;

You might also like