duong di ngan nhat

4
 11 Chuyên Tin - NTĐ ĐƯỜNG ĐI NGN NHT TRÊN ĐỒ TH(Không cha chu trình âm) 1. Thut toán Ford Bellmn ! t"m #$%n& #' n&(n nh)t *u)t +hát t, m-t #nh. 1.1. B/' toán0 Cho G=(V, ) !" #$n #% th& c' hng (ho*c +ô hng), c' trng . +" /hông c' chu trình âm0 Tìm #ng #i #$n ng2n nh3t 4u3t 5h6t t7 #8nh u ti #8nh + (u 9 +)0 V: ;< 1.. Thut toán0 Gi> ? ma tr @n trng . !" AB100N, 100N ABi,D !" #E ;"i cFnhcung (i,D)0 H IJng m>ng IB100N, trong #' IBi !u #E ;"i #ng #i t7 #8nh u #n #8nh i0 H IJng m>ng TrB100N !u +t #ng #i, trong #' TrB+ !" #8nh !iLn trc #8nh + trên #ng #i t7 #8nh u #n #8nh + (+VMuO)0 H ThPc hiQn n-1 !Rn c@5 nh@t #E ;"i #ng #i, mSi !Rn c@5 nh@t  Nếu (i,j) là mt cnh/cung ca G và V[j]>V[i] + (i, j) thì cnht li V[ j] ! V[i]+"[i,j] H au n-1 !Rn c@5 nh@t thì IB+ ch:nh !" #E ;"i #ng #i ng2n nh3t t7 u #n +0 H Chi 5h: thi gian cUa thu@t to6n !" (n W ) 1.2. 3/' #4t0 Ch$ng trình con ;i #ây tìm #ng #i ng2n nh3t t7 #8nh u #n c6c #8nh cXn !Fi0 Procedure Ford_Belman (u: integer);  Var i, j, k: integer; ok:boolean ; Begin For i:=1 to n do  begin tr[i]:=u; d[i]:= INFINITY; if a[u,i]<>  INFINITY then d[i]:=a[u,i]; end; tr[u]:=0; d[u]:=0; For k:= 1 to n-1 do  begin ok := true; {Ok= true nghia là không làm tt du! na" for i:= 1 to n do for j:=1 to n do if j <>  u then if d[j]> d[i]+a[i,j] then  begin d[j] := d[i]+a[i,j]; tr[j]:= i; ok:=#al$e; end; if ok then break; end; End; Procedure %rint_out;  Var i,j,!ount: integer; dd: arr1; Begin In&ut Out&ut ' ( 1 1 ) 1 1 ' * ) * * ) + * ) ' , * + 1 * ' -' + * ) ' + + 1-).1 1-/) 1-*.+ 1-/)-/* 1-+.* 1-/)-/*-/'-/+ 1-'.-1 1-/)-/*-/' 1

Upload: phan-anh-tuan

Post on 08-Oct-2015

3 views

Category:

Documents


0 download

DESCRIPTION

dijkstra cơ bản

TRANSCRIPT

11 Chuyn Tin - NT

NG I NGN NHT TRN TH(Khng cha chu trnh m)

1. Thut ton Ford Bellman - tm ng i ngn nht xut pht t mt nh.1.1. Bi ton: Cho G=(V,E) l n th c hng (hoc v hng), c trng s v khng c chu trnh m. Tm ng i n ngn nht xut pht t nh u ti nh v (u v).InputOutput

5 9 11 2 1

1 5 3

2 3 3

2 4 3

2 5 8

3 4 1

3 5 -5

4 3 2

5 4 41-2:1

1->2

1-3:4

1->2->3

1-4:3

1->2->3->5->4

1-5:-1

1->2->3->5

V d:

1.2. Thut ton:Gi s ma trn trng s l A[1..N, 1..N]: A[i,j] l di cnh/cung (i,j).

+ Dng mng D[1..N], trong D[i] lu di ng i t nh u n nh i.

+ Dng mng Tr[1..N] lu vt ng i, trong Tr[v] l nh lin trc nh v trn ng i t nh u n nh v (v(V\{u}).

+ Thc hin n-1 ln cp nht di ng i, mi ln cp nht:

Nu (i,j) l mt cnh/cung ca G v V[j]>V[i] + (i, j) th cp nht li V[j] = V[i]+A[i,j]+ Sau n-1 ln cp nht th D[v] chnh l di ng i ngn nht t u n v.

+ Chi ph thi gian ca thut ton l O(n3)

1.3. Ci t:

Chng trnh con di y tm ng i ngn nht t nh u n cc nh cn li.

Procedure Ford_Belman(u: integer);Var i, j, k: integer; ok:boolean;Begin

For i:=1 to n do begin

tr[i]:=u; d[i]:= INFINITY;

if a[u,i] INFINITY then d[i]:=a[u,i];

end;

tr[u]:=0; d[u]:=0;

For k:= 1 to n-1 do begin

ok := true; {Ok= true nghia l khng lm t?t du?c n?a}

for i:= 1 to n do

for j:=1 to n do

if j u then

if d[j]>d[i]+a[i,j] then begin

d[j] := d[i]+a[i,j];

tr[j]:= i;

ok:=false;

end;

if ok then break;

end;End;Procedure Print_out;Var i,j,count: integer;

dd: arr1;Begin

For i:=1 to n do if is then begin

Writeln(g,s,'-',i,':',d[i]);

j:= i;count:=0;

repeat

inc(count);

dd[count]:=j;

j:=tr[j];

until j=0;

for j:=count downto 2 do write(g,dd[j],'->'); writeln(g,i); End;End;2. Thut ton Floyd - tm ng i ngn nht gia mi cp nh.

1.1. Bi ton:

Cho G=(V,E) l n th c hng (hoc v hng), c trng s v khng c chu trnh m. Tm ng i n ngn nht gia mi cp nh u v v (u v).

InputOutput

5 9

1 2 1

1 5 3

2 3 3

2 4 3

2 5 8

3 4 1

3 5 -5

4 3 2

5 4 41-2:1

1->2

1-3:4

1->2->3

1-4:3

1->2->3->5->4

1-5:-1

1->2->3->5

2-1:No path... (cn na)

V d:

1.2. Thut ton:

Gi s ma trn trng s l A[1..N, 1..N]: A[i,j] l di cnh/cung (i,j).

+ Dng mng D[1..N,1..N], trong D[i,j] lu di ng i t nh i n nh j.

+ Dng mng Tr[1..N,1..N] lu vt ng i, trong Tr[i,j]=k ngha l ng i ngn nht t nh i n nh j, trc khi n j phi i qua nh k.

+ t c iu ny, ta xt mi nh k, nu D[i,j] > D[i,k] + D[k,j] th cp nht D[i,j]:

+ Chi ph thi gian ca thut ton l O(n3)

1.3. Ci t:

Procedure Floyd;

Var i, j, k: integer;

Begin

For i:= 1 to n do begin

For j:=1 to n do begin

D[i,j]:=INFINITY; Tr[i,j]:=0;

If a[i,j] INFINITY then D[i,j]:=a[i,j];

End;

End;

For k:=1 to n do

For i:=1 to n do

For j:=1 to n do

If(D[i,k]INFINITY)and (D[k,j]INFINITY)and (D[i,j] > D[i,k]+D[k,j]) then begin

D[i,j]:= D[i,k]+D[k,j];

Tr[i,j]:=k;

end;

End;

Procedure Print_out;

Var i,j,count,k: integer;

dd: array[1..maxn]of integer;

Begin

For i:=1 to n do

For j:=1 to n do

if i j then begin

Write(g,i,'-',j,':');

If D[i,j] = INFINITY then begin

Writeln(g,'No path'); continue;

End;

Writeln(g,D[i,j]);

Count:=1; dd[1]:=j; k:=tr[i,j];

while (ki)and(k0) do begin

Inc(count); dd[count]:=k; k:=tr[i,k];

end;

inc(count); dd[count]:=i;

For k:=count downto 2 do write(g,dd[k],'->');

writeln(g,j);

end;

End;3. Thut ton Dijkstra - tm ng i ngn nht t nh u n nh v.

1.1. Bi ton:

Cho G=(V,E) l n th c hng (hoc v hng), c trng s khng m. Tm ng i n ngn nht nh u v v (u v).

InputOutput

5 9 1 51 2 1

1 5 82 3 3

2 4 3

2 5 8

3 4 1

3 5 34 3 2

5 4 4

V d:

1.2. Thut ton:

Gi s ma trn trng s l A[1..N, 1..N]: A[i,j] l di cnh/cung (i,j).

+ Dng mng D[1..N], trong D[i] lu di ng i t nh u n nh i.

+ Dng mng E[1..N], trong E[i] = true cho bit ng i t nh u n nh i ti u.

+ Dng mng Tr[1..N] lu vt ng i, trong Tr[v] l nh lin trc nh v trn ng i t nh u n nh v (v(V\{u}).

B1: Khi to:

- D[i] = A[u,i] (nu khng c cnh ni th D[i] = IFNINITY), Tr[i] = u, E[i] = false (( i(V\{u}).

- D[u] = 0, E[u] = true; (u l nh xut pht)

B2: Lp

B2.1: Tm i0 cha ti u (E[i0] = false) v c D[i0] nh nht B2.2: Nu khng tm c (i0 = 0 hoc i0= v) th chm dt vng lp. Nu tm c i0 th:

- nh du i0 l ti u (E[i0] = true);

- Ti u cc nh cha ti u cn li theo i0. Cng thc:

D[j] = Min{ V[j], V[i0] + A[i0,j] }; Tr[j] = i; (( j(V cn cha ti u)

B3: In kt qu.

+ Chi ph thi gian ca thut ton l O(n2)

1.3. Ci t: Tm ng i ngn nht t u n v.Procedure Dijkstra;Var i0, j, dmin: integer;Begin

For j:= 1 to n do begin

Tr[j]:= s; E[j] := false;

if a[s,j] INFINITY then d[j]:=a[s,j] else d[j]:=INFINITY;

end;

e[s]:=true; d[s]:=0;

while true do begin

i0:=0; dmin:=INFINITY;

for j:= 1 to n do

if not e[j] and (d[j] < dmin) then begin

i0:=j; dmin:=d[j];

end;

if (i0 = 0)or(i0=t) then break; e[i0] := true;

for j:=1 to n do

if not e[j] and (d[j] > d[i0] + a[i0,j]) then begin

tr[j]:= i0; d[j]:=d[i0] + a[i0,j];

end;

end;End;Procedure Print_out;Var j,count: integer; dd: arr1;Begin

if d[t] = INFINITY then Writeln(g,s,'-',t,': No Path')

else begin

j:= t; count:=0; while js do begin

inc(count); dd[count]:=j; j:=tr[j]; end; writeln(g,s,'-',t,': ',d[t]); write(g,s); for j:= count downto 1 do write(g,'->',dd[j]); End;End;

PAGE 2