zoukankan      html  css  js  c++  java
  • 最少换乘

    Description

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

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

     

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

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

     

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

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

    Input

    第一行:     K              表示有多少组测试数据。(2k8

    接下来对每组测试数据:

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

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

    Output

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

    Sample Input

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

    Sample Output

    2
    NO

    最短路变形 建个图用迪杰斯特拉 算法 (注意下 有向图)
    #include <cstdio>
    #include <queue>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int oo = 0x3f3f3f3f;
    const int N = 555;
    const int M = 6000;
    typedef long long LL;
    int maps[N][N], vis[N], dis[N], n, m, num[N];
    char str[M];
    void init()
    {
        for(int i = 0; i < 555; i++)
        {
            for(int j = 0; j < 555; j++)
                maps[i][j] = oo;
            maps[i][i] = 0;
        }
        memset(vis, 0, sizeof(vis));
    }
    void prime()
    {
        int i, j, index, mini;
        for(i = 1; i <= n; i++)
            dis[i] = maps[1][i];
        vis[1] = 1;
        for(i = 1; i < n; i++)
        {
            mini = oo;index = 0;
            for(j = 1; j <= n; j++)
            {
                if(!vis[j] && dis[j] < mini)
                {
                    mini = dis[j];
                    index = j;
                }
            }
            vis[index] = 1;
            for(j = 1; j <= n; j++)
            {
                if(!vis[j] && dis[j] > maps[index][j] + dis[index])
                    dis[j] = dis[index] + maps[index][j];
            }
        }
    }
    int main()
    {
        int T, k, i, j, ans;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d %d ", &m, &n);
            init();
            while(m--)
            {
               gets(str);
               k = 0;
               for(i = 0; i < strlen(str); i++)
               {
                   if(str[i] != ' ')
                   {
                       ans = 0;
                       while(str[i] != ' ' && i < strlen(str))
                       {
                           ans = ans*10 + (str[i]-'0');
                           i++;
                       }
                       num[k++] = ans;
                   }
                   //else i++;
               }
               for(i = 0; i < k-1; i++)
               {
                   for(j = i+1; j < k; j++)
                    maps[num[i]][num[j]] = 1;
               }
            }
            prime();
            ans = dis[n];
            if(ans != oo) printf("%d
    ", ans-1);
            else printf("NO
    ");
        }
        return 0;
    }
     
    

      

  • 相关阅读:
    kafka中配置细节
    kafka原理
    storm中的基本概念
    Spring装配Bean的过程补充
    Spring装配Bean的过程
    java中被遗忘的native关键字
    水塘抽样
    js常用总结
    HttpServletResponse status对应的状态信息
    mongoDB常用命令总结
  • 原文地址:https://www.cnblogs.com/PersistFaith/p/4816775.html
Copyright © 2011-2022 走看看