p1053.dpr
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· DPR 代码 · 共 114 行
DPR
114 行
program p1053;
{$APPTYPE CONSOLE}
{%File 'p.in'}
const
maxn = 20;
tab = chr ( 9 );
type
Tmap = array[1..maxn , 1..maxn] of Longint;
Tnum = array[1..maxn] of Longint;
var
part , n : Longint;
fire , r : Longint;
card : Tnum;
min : Tnum;
pred : Tnum;
mk : Tnum;
map : Tmap;
procedure init;
var i ,j : Longint;
begin
readln ( n );
for i := 1 to n do
begin
for j := 1 to n do read ( map [i] [j] );
readln;
end;
read ( fire );
r := 0;
while ( not seekeoln ) do
begin
inc ( r );
read ( card [r] );
end;
readln;
end;
procedure dijkstra;
var i , k : Longint;
begin
for i := 1 to n do if map [i] [fire] = -1 then min [i] := maxLongint
else begin min [i] := map [i] [fire]; pred [i] := fire; end;
fillchar ( mk , sizeof ( mk ) , 0 ); mk [fire] := 1;
repeat
k := 0;
for i := 1 to n do if ( mk [i] = 0 ) then
if ( k = 0 ) or ( min [i] < min [k] ) then k := i;
if k = 0 then break; mk [k] := 1;
for i := 1 to n do if ( mk [i] = 0 ) and ( map [i] [k] >= 0 )then
if ( min [k] + map [i] [k] < min [i] ) then
begin
min [i] := min [k] + map [i] [k];
pred [i] := k;
end;
until false;
end;
procedure sort;
var i , j , t : Longint;
begin
for i := 1 to r - 1 do
for j := i + 1 to r do
if min [card [i]] > min [card [j]] then
begin
t := card [i];
card [i] := card [j];
card [j] := t;
end;
end;
procedure print;
var i , j : Longint;
begin
writeln ( 'Org' , tab , 'Dest' , tab , 'Time' , tab , 'Path' );
for i := 1 to r do
begin
write ( card [i] , tab , fire , tab , min [card [i]] );
j := card [i];
repeat
write ( tab , j );
if j = fire then break;
j := pred [j];
until false;
writeln;
end;
end;
begin
assign ( input , 'p.in' ); reset ( input );
assign ( output, 'p.out' ); rewrite ( output );
readln ( part );
while ( part > 0 ) do
begin
init;
dijkstra;
sort;
print;
dec ( part );
if part > 0 then writeln;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?