飞机最少换乘次数问题
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:380 测试通过:158
总提交:380 测试通过:158
描述
设有n个城市,编号为0~n-1,m条单向航线的起点和终点由输入提供,寻找一条换乘次数最少的线路方案。
输入
第一行为三个整数n、m、v,表示城市数、单向航线数和起点城市。以下m行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。2≤n≤20,1≤m≤190
输出
共n-1行,分别是从起点城市v到其他n-1个城市最少换乘次数,按照终点城市序号从小到大顺序输出,不能抵达时输出-1。
样例输入
3 2 0
0 1
1 2
样例输出
1
2
题目来源
CHENZ
题解:简单的BFS
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int LEN=30;
typedef struct
{
int n; //城市的代号
int ncount;//该城市到其他城市的道路数目
int des[LEN];//到的其他城市
}City;
City city[LEN];
queue<City>q; //队列
int ans[LEN]; //结果
bool vis[LEN];//记录有没有访问过
int n;
void bfs(int v)
{
int cou=0;
vis[v]=1;
for(int i=0;i<city[v].ncount;i++) //将起点v指向的目的地压入队列
{
vis[city[v].des[i]]=1;
q.push(city[city[v].des[i]]);
}
while(!q.empty()) //当队列非空时
{
cou++; //代表bfs的深度
int res=q.size(); //当前队列的大小
for(int i=0;i<res;i++) //对于队列的第一个元素将它所指向的目的地压入队列,将它自己弹出
{
int tmp=q.front().n;
ans[tmp]=cou;
q.pop();
for(int j=0;j<city[tmp].ncount;j++)
{
if(!vis[city[tmp].des[j]])
{
vis[city[tmp].des[j]]=1;
q.push(city[city[tmp].des[j]]);
}
}
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
memset(ans,-1,sizeof(ans));
memset(city,0,sizeof(city));
int m,v;
scanf("%d %d %d",&n,&m,&v);
for(int i=0;i<n;i++) //初始化city[i].n
city[i].n=i;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
city[a].des[city[a].ncount++]=b;
}
bfs(v);
for(int i=0;i<n;i++)
{
if(i!=v)
printf("%d\n",ans[i]);
}
return 0;
}