最少换乘 之简化版
将题目中要的 需要换的车数 换成 需要走的站数
下面附上 本人的 渣渣代码
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\n",mark-1); 84 else 85 printf("NO\n"); 86 mark=0; 87 } 88 return 0; 89 }