您的位置:首页 > 其它

NYOJ 题目1238 最少换乘

2016-05-21 13:05 232 查看


最少换乘

时间限制:2000 ms  |  内存限制:65535 KB
难度:3

描述

 欧洲某城是一个著名的旅游胜地,每年都有成千上万的人前来观光旅行。Dr. Kong决定利用暑假好好游览一番。。

年轻人旅游不怕辛苦,不怕劳累,只要费用低就行。但Dr. Kong年过半百,他希望乘坐BUS从住的宾馆到想去游览的景点,期间尽可量地少换乘车。

 

Dr. Kon买了一张旅游地图。他发现,市政部门为了方便游客,在各个旅游景点及宾馆,饭店等地方都设置了一些公交站并开通了一些单程线路。每条单程线路从某个公交站出发,依次途经若干个站,最终到达终点站。

但遗憾的是,从他住的宾馆所在站出发,有的景点可以直达,有的景点不能直达,则他可能要先乘某路BUS坐上几站,再下来换乘同一站的另一路BUS, 这样须经过几次换乘后才能到达要去的景点。

 

为了方便,假设对该城的所有公交站用1,2,……,N编号。Dr. Kong所在位置的编号为1,他将要去的景点编号为N。

请你帮助Dr. Kong寻找一个最优乘车方案,从住处到景点,中间换车的次数最少。

输入第一行: K 表示有多少组测试数据。(2≤k≤8)

接下来对每组测试数据:

第1行: M N 表示有M条单程公交线路,共有N站。(1<=M<=100 1<N<=500)

第2~M+1行: 每行描述一路公交线路信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。

输出对于每组测试数据,输出一行,如果无法乘坐任何线路从住处到达景点,则输出"N0",否则输出最少换车次数,输出0表示不需换车可以直达。
样例输入
2
3 7
6 7
4 7 3 6
2 1 3 5
2 6
1 3 5
2 6 4 3


样例输出
2
NO


来源
第八届河南省程序设计大赛

最短路模版就不说了

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

using namespace std;

const int N=505;

int book
, dis
, num
;

int smap

;

char str[100000];

const int inf=99999999;

int main()

{

    int t;

    cin>>t;

    while(t--)

    {

        int m, n;

        cin>>m>>n;

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=n;j++)

            {

                if(i==j)

                {

                    smap[i][j]=0;

                }

                else

                {

                    smap[i][j]=inf;

                }

            }

        }

        getchar();

        while(m--)

        {

            memset(str,0,sizeof(str));//注意初始化

            gets(str);

            int k=0;

            for(int i=0;str[i];i++)

            {

                if(str[i]!=' ')

                {

                    int sum=0;

                    for(;str[i]&&str[i]!=' ';i++)

                    {

                        sum=sum*10+(str[i]-'0');

                    }

                    num[k++]=sum;

                }

            }

            for(int j=0;j<k;j++)

            {

                for(int p=j+1;p<k;p++)

                {

                    smap[num[j]][num[p]]=1;

                }

            }

        }

        for(int i=1;i<=n;i++)

        {

            dis[i]=smap[1][i];

        }

        memset(book,0,sizeof(book));

        book[1]=1;

        int v;

        for(int i=1;i<=n;i++)

        {

            int mint=inf;

            for(int j=1;j<=n;j++)

            {

                if(book[j]==0&&dis[j]<mint)

                {

                    mint=dis[j];

                    v=j;

                }

            }

            book[v]=1;

            for(int u=1;u<=n;u++)

            {

                if(smap[v][u]<inf&&dis[u]>dis[v]+smap[v][u])

                {

                    dis[u]=dis[v]+smap[v][u];

                }

            }

        }

        if(dis
==inf)

        {

            cout<<"NO"<<endl;

        }

        else

        {

            cout<<dis
-1<<endl;

        }

    }

    return 0;

}

佛洛依德

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cctype>

using namespace std;

char str[100000];

int num[10000], s[505][505];

int inf=99999999;

int main()

{

    int t;

    cin>>t;

    while(t--)

    {

        int m, n;

        cin>>m>>n;

        getchar();

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=n;j++)

            {

                if(i==j)

                {

                    s[i][j]=0;

                }

                else

                {

                    s[i][j]=inf;

                }

            }

        }

        for(int i=0;i<m;i++)

        {

            memset(str,0,sizeof(str));

            int k=0;

            gets(str);

            for(int j=0;str[j];j++)

            {

                if(isdigit(str[j]))

                {

                    int sum=0;

                    for(;str[j]&&str[j]!=' ';j++)

                    {

                        sum=sum*10+(str[j]-'0');

                    }

                    num[k++]=sum;

                }

            }

            for(int i=0;i<k;i++)

            {

                for(int j=i+1;j<k;j++)

                {

                    s[num[i]][num[j]]=1;

                }

            }

        }

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=n;j++)

            {

                for(int k=1;k<=n;k++)

                {

                    if(s[j][k]>s[j][i]+s[i][k]&&s[j][i]!=inf&&s[i][k]!=inf)

                    {

                        s[j][k]=s[j][i]+s[i][k];

                    }

                }

            }

        }

        if(s[1]
==inf)

        {

            cout<<"NO"<<endl;

        }

        else

        {

            cout<<s[1]
-1<<endl;

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: