duong di ngan nhat
DESCRIPTION
dijkstra cơ bảnTRANSCRIPT
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