267. [NOI1997] 最优乘车

★★   输入文件:bustravel.in   输出文件:bustravel.out   简单对比

时间限制:1 s   内存限制:128 MB

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条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。<n<=500),表示开通了m条单程巴士线路,总共有n个车站。从第二行到第m+1行依次给出了第1条到第m条巴士线路的信息。其中第 p="" i+1行给出的是第i条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。<="">

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

样例

输入文件

3 7
6 7
4 7 3 6
2 1 3 5

输出文件

2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
  
using namespace std;
const int INF=9999999;
  
int n,m,c,x,a[101][501],f[501][501];
  
void read()
{
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)   
        for(int j=1;j<=n;j++)
            f[i][j]=INF;
    for(int i=1;i<=m;i++)
    {
        c=0;char b=' ';
        while(b!='\n'/*&&b!='/r'*/)
        {
            scanf("%d",&x);b=getchar();
            a[i][++c]=x;
            for(int j=1;j<c;j++)
                f[a[i][j]][x]=1;
        }
    }
    for(int i=1;i<=n;i++)f[i][i]=0;
}
  
void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
}
  
int main()
{
    freopen("bustravel.in","r",stdin);
    freopen("bustravel.out","w",stdout);
    read();
    floyd();
    if(f[1][n]>=INF)printf("NO\n");
    else printf("%d\n",f[1][n]-1);
    return 0;
}

  

posted @   ioioioioioio  阅读(265)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示