码迷,mamicode.com
首页 > 其他好文 > 详细

最少换乘

时间:2015-09-17 17:23:05      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

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

最短路变形 建个图用迪杰斯特拉 算法 (注意下 有向图)
 1 #include <cstdio>
 2 #include <queue>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 const int oo = 0x3f3f3f3f;
10 const int N = 555;
11 const int M = 6000;
12 typedef long long LL;
13 int maps[N][N], vis[N], dis[N], n, m, num[N];
14 char str[M];
15 void init()
16 {
17     for(int i = 0; i < 555; i++)
18     {
19         for(int j = 0; j < 555; j++)
20             maps[i][j] = oo;
21         maps[i][i] = 0;
22     }
23     memset(vis, 0, sizeof(vis));
24 }
25 void prime()
26 {
27     int i, j, index, mini;
28     for(i = 1; i <= n; i++)
29         dis[i] = maps[1][i];
30     vis[1] = 1;
31     for(i = 1; i < n; i++)
32     {
33         mini = oo;index = 0;
34         for(j = 1; j <= n; j++)
35         {
36             if(!vis[j] && dis[j] < mini)
37             {
38                 mini = dis[j];
39                 index = j;
40             }
41         }
42         vis[index] = 1;
43         for(j = 1; j <= n; j++)
44         {
45             if(!vis[j] && dis[j] > maps[index][j] + dis[index])
46                 dis[j] = dis[index] + maps[index][j];
47         }
48     }
49 }
50 int main()
51 {
52     int T, k, i, j, ans;
53     scanf("%d", &T);
54     while(T--)
55     {
56         scanf("%d %d ", &m, &n);
57         init();
58         while(m--)
59         {
60            gets(str);
61            k = 0;
62            for(i = 0; i < strlen(str); i++)
63            {
64                if(str[i] !=  )
65                {
66                    ans = 0;
67                    while(str[i] !=   && i < strlen(str))
68                    {
69                        ans = ans*10 + (str[i]-0);
70                        i++;
71                    }
72                    num[k++] = ans;
73                }
74                //else i++;
75            }
76            for(i = 0; i < k-1; i++)
77            {
78                for(j = i+1; j < k; j++)
79                 maps[num[i]][num[j]] = 1;
80            }
81         }
82         prime();
83         ans = dis[n];
84         if(ans != oo) printf("%d\n", ans-1);
85         else printf("NO\n");
86     }
87     return 0;
88 }

 



最少换乘

标签:

原文地址:http://www.cnblogs.com/PersistFaith/p/4816775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!