1. Trang chủ
  2. » Giáo án - Bài giảng

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

4 6K 138
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 43 KB

Nội dung

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.

Trang 1

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 Đỉnhcuối Trọng số

x1 y1 w1

x2 y2 w2

xm ym wm

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 > z1 >z2 >…zn >z là đường

đi ngắn nhất

Trang 2

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;

Trang 3

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

Trang 4

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

Ngày đăng: 03/07/2013, 21:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w