最优乘车(noi97)

来源:百度知道 编辑:UC知道 时间:2024/06/03 02:11:20
【问题描述:】
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行依次给出了第1条到第M条巴士线路的信息。其中第i+1行给出的是第i条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。
【输出:】
一行。如果无法乘巴士从饭店到达S公园,则输出"N0",否则输出你的程序所找到的最少换车次数,换车次数为0表示不需换车即可到达·
【样例输入:】
3 7
6 7
4 7 3 6
2 1 3 5
【样例输出:】
2
PASCAL语言来解...给我源程序也可以,给我讲也行,总之让我会了,就有分,非诚务扰
给大家透个底,我目前有167分,如果让我学会了,167全给你,小佑0_0糖说到做到,这个题对我很重要,谢谢

不知道楼上程序哪里来的。。。恩,我不敲程序了,说一个思路吧~
其实我们可以这么考虑,一个巴士线路上的站都只要乘一次就到了,那么我们建立图,如果i站点和j站点同时出现在一个巴士线路上就连一条边~
然后就可以用最短路径做啦~~dijstra~~无聊的话用dijstra+heap,哈哈~

其实我一开始想到的是并查集。。。但是好像达不到最优状态。后来才想到最短路径,其实也就是贪心啦。。。

97年的noi好和谐。。

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