Tải bản đầy đủ (.doc) (4 trang)

Cài đặt thuật toán Dijkstra tìm đường đi ngắn nhất

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (79.29 KB, 4 trang )

CÀI ĐẶT THUẬT TOÁN DIJKSTRA TÌM
ĐƯỜNG ĐI NGẮN NHẤT BẰNG CHƯƠNG
TRÌNH PASCAL
Thuật toán Dijkstra.
Chương trình thuật toán tìm đường đi ngắn nhất từ đỉnh a
đến đỉnh z.
Dữ liệu được lấy từ tệp DIJKSTRA.INP có cấu trúc :
n
(số đỉnh)
m
(số cạnh)
a
(đỉnh đầu)
z
(đỉnh
cuối)
Đỉnh đầu
Đỉnh
cuối
Trọng số
x
1
y
1
w
1
x
2
y
2
w


2
… … …
x
m
y
m
w
m
Sau khi lấy dữ liệu, chương trình sẽ xác định có tồn tại đường
đi ngắn nhất, tìm đường đi ngắn nhất đó và lưu vào tệp
DIJKSTRA.OUT có cấu trúc:
Dòng đầu : “NO” nếu không tồn tại
Dòng đầu : “YES” nếu tồn tại
Dòng 2: L(z) độ dài đường đi ngắn nhất
Dòng 3: a--> z
1
-->z
2
-->…z
n
-->z là đường
đi ngắn nhất
Chương trình: (DIJKSTRA.PAS)
PROGRAM thuat_toan_Dijkstra;
Uses crt;
Const
max=100;
oo=32000;
Type
mang=array[1..max] of integer;

Var
a:array[1..max,1..max] of integer;
d:mang;
truoc:mang;
chon:array[1..max] of boolean;
n,m,s,z:integer;
u,v,i:integer;
f,g:text;
Procedure input;
begin
writeln('doc du lieu tu file Dijkstra.inp');
assign(f,'Dijkstra.inp');reset(f);
readln(f,n,m,s,z);
for u:=1 to n do
for v:=1 to n do
if u=v then a[u,v]:=0 else a[u,v]:=oo;
for i:=1 to m do readln(f,u,v,a[u,v]);
close(f);
end;
Procedure Init;
Begin
for v:=1 to n do
begin
d[v]:=a[s,v];
truoc[v]:=s;
chon[v]:=false;
end;
d[s]:=0;
chon[s]:=true;
u:=s;

End;
Procedure Dijkstra;
Var
min:integer;
Begin
Repeat
for v:=1 to z do
if (not chon[v]) and (d[v] > d[u]+a[u,v]) then
begin
d[v]:= d[u] + a[u,v];
truoc[v]:=u;
end;
min:=oo;
for i:=1 to n do
if (not chon[i]) and (d[i]< min) then
begin
min:=d[i];
u:=i;
end;
if (min<> oo) then chon[u]:=true;
Until (chon[z]) or (min=oo);
End;
Procedure Output;
Var st,tam:string;
Begin
writeln('ghi ket qua ra file dijkstra.out');
assign(g,'dijkstra.out');rewrite(g);
if d[z]=oo then
writeln('NO')
else

begin
writeln(g,'YES');
writeln(g,d[z]);
st:='';
while (z<>s) do
begin
str(z,tam);
st:=st+tam;
z:=truoc[z];
end;
write(g,s);
for i:=length(st) downto 1 do write(g,' -> ',st[i]);
end;
close(g);
end;
BEGIN
clrscr;
input;
init;
dijkstra;
output;
readln;
END.
File vào ví dụ: (DIJKSTRA.INP)
4 7 1 4
1 2 7
1 3 5
2 4 6
2 3 7
3 4 11

4 1 4
4 2 1
File ra tương ứng: (DIJKSTRA.OUT)
YES
13
1 -> 2 -> 4

×