您的位置:首页 > 其它

最少换乘 之简化版

2016-03-14 10:49 148 查看
将题目中要的   需要换的车数 换成 需要走的站数





下面附上 本人的 渣渣代码

/*主要是因为  这个题按照要求写不出来  就先写了个这  等等补上  完整的*/
// 我的思路就是 用  vector去构建出来一个  有向图  然后开始广搜
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
struct station
{
int step,n;
}e;
vector<int>v[505];   //   用于 构造 单向图
queue<station>Q;        //  用于储存公交站
int visited[505],mark,count,c;
void map(int n)    // 开始构图
{
int q,i,j,a,b;  //  多弄几个标记变量
a=b=0;
char str[2000];
for(i=0;i<n;i++)
{
gets(str);     //  开始 每一 行 收 集信息
c=strlen(str);
for(q=j=0;j<c;q++,j++)
{
while(str[j]!=' '&&j<c)  //  如果不是空格的话 就可以出去了
{
a+=(str[j]-'0');  //
j++;
}
if(q!=0)  //   如果这是 第一次进来
{
v[b].push_back(a);      //   不是第一次进来 上一次算出来的值  给了b ,这次的值是  a  这样就是  b 可以到a 但是   a  不能到 b   形成了单程路线
}
b=a;
a=0;
}
}
}
void BFS(int n,int m)//  上面   map已经完成了 构图的 重任  下面就轮到 搜索了  再熟悉一下深搜和广搜的 区别
{                               //   在这里 要得就是最短路 所以直接去进行广搜 就对了
station q;
int i;
q.step=0;
q.n=n;
Q.push(q);
while(!Q.empty())
{
station q1;
q1=Q.front();
for(i=0;i<v[q1.n].size()&&!visited[q1.n];i++)  //  将可以从 n1  到达的 地方一个一个的压进去   已经做过大本营的 标记一下不再 做
{
station q;
q.n=v[q1.n][i];
q.step=q1.step+1;
Q.push(q);
}
visited[q1.n]=1;
Q.pop();
if(q1.n==m)
{
mark=q1.step;
}
if(mark!=0)
break; ;
}
while(!Q.empty())
Q.pop();
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(visited,0,sizeof(visited));
memset(v,0,sizeof(v));
scanf("%d%d",&n,&m);
getchar();
map(n);
BFS(1,m);   //从第一站 开始
if(mark!=0)
printf("%d\n",mark-1);
else
printf("NO\n");
mark=0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: