NOI 1997 最佳乘车(travel)

最优乘车

H城是一个旅游胜地,每年都有成千上万的人前来观光。为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路。每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。
  一名旅客最近到H城旅游,他很想去S公园游玩,但如果从他所在的饭店没有一路已士
可以直接到达S公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士, 这样换乘几次后到达S公园。
  现在用整数1,2,…N 给H城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为1…S公园巴士站的编号为N。
  写一个程序,帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程
中换车的次数最少。

 

输入:

第一行有两个数字M和N(1<=M<=100 1<N<=500),表
示开通了M条单程巴士线路,总共有N个车站。从第二行到第M刊行依次给出了第1条到
第M条巴士线路的信息。其中第i+1行给出的是第i条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。

 

输出:

只有一行。如果无法乘巴士从饭店到达S公园,则输出
"NO",否则输出你的程序所找到的最少换车次数,换车次数为0表示不需换车即可到达?

 

最短路裸题!注意是有向图,然后,同一条路线内的前面的所有点到后面的点都有一条边权为1 的边,求最短路,然后f[1,n]-1就是了

 

 1 program test;
 2 const
 3   inf='travel.in';
 4   outf='travel.out';
 5 
 6 var
 7   n,m,i,j,k,a,b,t1,t2:longint;
 8   f:array[1..500,1..500] of longint;
 9   apple:array[1..500] of longint;
10 
11 function min(aa,bb:longint):longint;
12 begin
13   if aa<bb then exit(aa)
14    else exit(bb);
15 end;
16 
17 begin
18   assign(input,inf);
19   assign(output,outf);
20   reset(input);
21   rewrite(output);
22 
23   readln(m,n);
24 
25   for i:= 1 to n do
26     for j:= 1 to n do
27       if i<>j then f[i,j]:=maxlongint div 2;
28 
29   for i:= 1 to m do
30     begin
31       j:=0;
32       while not(eoln) do
33        begin
34          inc(j);
35          read(apple[j]);
36          for k:= 1 to j-1 do
37            f[apple[k],apple[j]]:=1;
38        end;
39        readln;
40     end;
41 
42   for k:= 1 to n do
43     for i:= 1 to n do
44       for j:= 1 to n do
45         f[i,j]:=min(f[i,j],f[i,k]+f[k,j]);
46 
47 
48   if f[1,n]<>maxlongint div 2 then writeln(f[1,n]-1)
49     else writeln('NO');
50 
51 
52   close(input);
53   close(output);
54 end.

 

posted @ 2017-02-14 19:47  bobble  阅读(466)  评论(0编辑  收藏  举报