最少换乘 之简化版

将题目中要的   需要换的车数   换成  需要走的站数

下面附上 本人的 渣渣代码

 1 /*主要是因为  这个题按照要求写不出来  就先写了个这  等等补上  完整的*/
 2 // 我的思路就是 用  vector去构建出来一个  有向图  然后开始广搜
 3 #include<stdio.h>
 4 #include<vector>
 5 #include<queue>
 6 #include<string.h>
 7 using namespace std;
 8 struct station
 9 {
10     int step,n;
11 }e;
12 vector<int>v[505];   //   用于 构造 单向图
13 queue<station>Q;        //  用于储存公交站
14 int visited[505],mark,count,c;
15 void map(int n)    // 开始构图
16 {
17     int q,i,j,a,b;  //  多弄几个标记变量
18     a=b=0;
19     char str[2000];
20     for(i=0;i<n;i++)
21     {
22         gets(str);     //  开始 每一 行 收 集信息
23         c=strlen(str);
24         for(q=j=0;j<c;q++,j++)
25         {
26             while(str[j]!=' '&&j<c)  //  如果不是空格的话 就可以出去了
27             {
28                 a+=(str[j]-'0');  //
29                 j++;
30             }
31             if(q!=0)  //   如果这是 第一次进来
32             {
33                 v[b].push_back(a);      //   不是第一次进来 上一次算出来的值  给了b ,这次的值是  a  这样就是  b 可以到a 但是   a  不能到 b   形成了单程路线
34             }
35             b=a;
36             a=0;
37         }
38     }
39 }
40 void BFS(int n,int m)//  上面   map已经完成了 构图的 重任  下面就轮到 搜索了  再熟悉一下深搜和广搜的 区别
41 {                               //   在这里 要得就是最短路 所以直接去进行广搜 就对了
42     station q;
43     int i;
44     q.step=0;
45     q.n=n;
46     Q.push(q);
47     while(!Q.empty())
48     {
49         station q1;
50         q1=Q.front();
51         for(i=0;i<v[q1.n].size()&&!visited[q1.n];i++)  //  将可以从 n1  到达的 地方一个一个的压进去   已经做过大本营的 标记一下不再 做
52         {
53             station q;
54             q.n=v[q1.n][i];
55             q.step=q1.step+1;
56             Q.push(q);
57         }
58         visited[q1.n]=1;
59         Q.pop();
60         if(q1.n==m)
61         {
62             mark=q1.step;
63         }
64         if(mark!=0)
65             break; ;
66     }
67     while(!Q.empty())
68         Q.pop();
69 }
70 int main()
71 {
72     int t,n,m;
73     scanf("%d",&t);
74     while(t--)
75     {
76         memset(visited,0,sizeof(visited));
77         memset(v,0,sizeof(v));
78         scanf("%d%d",&n,&m);
79         getchar();
80         map(n);
81         BFS(1,m);   //从第一站 开始
82         if(mark!=0)
83             printf("%d
",mark-1);
84         else
85             printf("NO
");
86         mark=0;
87     }
88     return 0;
89 }
原文地址:https://www.cnblogs.com/A-FM/p/5274894.html