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;
Trang 2Until 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ó
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);
Trang 3end;
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;
Trang 4procedure 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