|
最优乘车问题
输入数据:输入文件INPUT.TXT。文件的第行是一个数字M(1≤M≤100)表示开通了M条单向巴士线路,第2行是一个数字N(1<N≤500),表示共有N个车站。从第3行到第M+2行依次给出了第一条到第M条巴士线路的信息。其中第i+2行给出的是第i条巴士线路的信息,从左至右依次按行行驶顺序给出了该线路上的所有站点,相邻两个站号之间用一个空格隔开。
输出数据:输出文件是OUTPUT.TXT。文件只有一行,为最少换车次数(在0,1,…,M-1中取值),0表示不需换车即可达到。如果无法乘车达到S公园,则输出“NO”。
Program Travel;
var m:1..100; {m为开通的单向巴士线路数}
n:1..500; {n为车站总数}
result:array[1..501] of -1..100; {到某车站的最少换车数}
num:array[1..500,1..50] of 1..500; {从某车站可达的所有车站序列}
sum:array[1..500] of 0..50; {从某车站可达的车站总数}
check:array[1..500] of Boolean; {某车站是否已扩展完}
Procedure Init;
var f1:text;
a,b,c,d:byte;
data:array[1..100] of 0..100;
begin
assign(f1,'input.txt');
reset(f1);
readln(f1,m);
readln(f1,n);
result[501]:=100;
for a:=1 to m do
begin
for b:=1 to 100 do data[b]:=0;
b:=0;
repeat
inc(b);
read(f1,data[b]);
until eoln(f1);
for c:=1 to b-1 do
for d:=c+1 to b do
begin
inc(sum[data[c]]);
num[data[c],sum[data[c]]]:=data[d];
end;
end;
end;
Procedure Done;
var min,a,b,c,total:integer;
begin
fillchar(result,sizeof(result),-1);
result[1]:=0;
for c:=1 to sum[1] do result[num[1,c]]:=0;
b:=data[1,1];
repeat
for c:=1 to sum[b] do
if (result[num[b,c]]=-1) then result[num[b,c]]:=result[b]+1;
min:=501;
for c:=1 to n do if (result[c]<>-1) and (result[c]<result[min])
then min:=c;
b:=min;
until result[n]<>-1;
writeln(result[n]);{到达S公园的最少换车次数}
end;
begin
Init;
end.
|