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

thuật toán tìm đường đi dài 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 (46.43 KB, 4 trang )

Một số thuật toán
Trên đồ thị có hướng và không có chu trình 
Bài toán 1:
+Cho 1 đồ thị có hướng k có trọng số và k có chu trình.hãy tìm đường đi dài nhất trong đồ thị (qua nhìu
cạnh/đỉnh nhất )
+Thuật toán (Đánh mức) : gọi k là mức của 1 đỉnh ;
K:=0;
Repeat
K:=K+1;
Tìm các đỉnh trọc( đỉnh k có đường đi tới các đỉnh khác) và gán
mức cho nó là k;
Xóa các đỉnh được gán mức và các cung đi vào nó
Until<các đỉnh được gán mức>;
(*) Ý nghĩa : mức của 1 đỉnh là độ dài của đường đi dài nhất bắt đầu từ đỉnh i ;
Đường đi dài nhất là đường xuất phát từ 1 đỉnh có mức cao nhất;
(*) Tìm đường đi dài nhất
+Cách 1 : căn cứ vào mức của đỉnh để in ra ;
Repeat
For i:=1 to n do
If muc[i]=k then
Begin
Write(i,’ ‘);
Break;
End;


Dec(k);
Until k=0;
Cách 2 : dùng mảng sau[i] để lưu lại các đỉnh trọc I, trong quá trình xóa các đỉnh trọc và
cung đi vào nó


 Code pascal 
const f1='danhmuc.inp';
f2='danhmuc.out';
var n,k,dem:longint;
m:array[1..100000,1..100000] of longint;
muc,ra:array[1..100000] of longint;
t1,t2:text;

procedure nhap;
var i,j:longint;
begin
assign(t1,f1);
reset(t1);
read(t1,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(t1,m[i,j]);
ra[i]:=ra[i]+m[i,j];
end;
readln(t1);


end;
close(t1);
end;

procedure xuli;
var i,j:longint;

begin
k:=0;dem:=0;
fillchar(muc,sizeof(muc),0);
repeat;
inc(k);
for i:=1 to n do
if (ra[i]=0) and(muc[i]=0) then
begin
muc[i]:=k;
inc(dem);
end;

for i:=1 to n do
if muc[i]=k then
for j:=1 to n do
if m[j,i]=1 then
dec(ra[j]);
until dem=n;
end;


procedure xuat;
var i,j:longint;
begin
assign(t2,f2);
rewrite(t2);
for i:=k downto 1 do
for j:=1 to n do
if muc[j]=i then
begin

write(t2,j,' ');
break;
end;
close(t2);
end;

begin
nhap;
xuli;
xuat;
end.



×