题解 : 给你几班车 , 主人公想从 1 到 N 问你需要 换乘几辆车 ? 对于这种 有去无回的 图 , 不需要做特殊处理 .
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<limits.h>
6 #include<algorithm>
7 #include<queue>
8 #include<vector>
9 #include<set>
10 #include<stack>
11 #include<string>
12 #include<sstream>
13 #include<map>
14 #include<cctype>
15 using namespace std; //最少换乘 , 由于是单源最短路径的求解 还是不用 Floyd 了 , 以免超时 , 而且已经证明这一道题上 Floyd是 Dijkstra的 100倍
16 int visited[505],dis[505],a[505][505];
17 int Dijkstra(int n)
18 {
19 for(int i=1;i<=n;i++) // 将 和 1 连接 , 的储存到dis中
20 dis[i]=a[1][i];
21 dis[1]=0;
22 visited[1]=1;
23 for(int i=1;i<=n;i++) // 一共有 七个站点
24 {
25 int v,minn=INT_MAX;
26 for(int j=1;j<=n;j++)
27 {
28 if(minn>dis[j]&&!visited[j])
29 {
30 minn=dis[j];
31 v=j;
32 }
33 }
34 visited[v]=1;
35 for(int j=1;j<=n;j++)
36 {
37 if(!visited[j]&&a[v][j]!=INT_MAX&&dis[v]!=INT_MAX&&dis[j]>dis[v]+a[v][j]) // 用 INT_MAX的 话存在一个问题就是只要一 + 就从最大值变成最小值 所以 用INT_MAX的话 需要谨慎对待相加问题
38 {
39 dis[j]=dis[v]+a[v][j];
40 }
41 }
42 }
43 return dis[n];
44 }
45 int main()
46 {
47 int t,n,m;
48 string road;
49 scanf("%d",&t);
50 while(t--)
51 {
52 scanf("%d%d",&m,&n);
53 for(int i=0;i<=n;i++)
54 {
55 dis[i]=INT_MAX;
56 for(int j=0;j<=n;j++)
57 a[i][j]=INT_MAX;
58 }
59 memset(visited,0,sizeof(visited));
60 if(t!=0)
61 getchar();
62 for(int i=0;i<m;i++)
63 {
64 int sum=0;
65 getline(cin,road); // 第一行数据
66 int q=0;
67 for(int j=0;j<road.size();j++)
68 {
69 if(road[j]==' ')
70 {
71 dis[q++]=sum;
72 sum=0;
73 continue;
74 }
75 sum=sum*10+road[j]-'0';
76 }
77 dis[q++]=sum;
78 for(int w=0;w<q;w++)
79 for(int j=w+1;j<q;j++)
80 a[dis[w]][dis[j]]=1; // 一路车的 换乘次数就是 1 . 在每个 可以直接到达的地方 都是 1 , 如果需要倒车的话 在 +1
81 }
82 int e=Dijkstra(n);
83 if(e==INT_MAX)
84 printf("NO
");
85 else
86 printf("%d
",e-1);
87 }
88 return 0;
89 }