【NOJ】1049 飞机最少换乘次数问题

飞机最少换乘次数问题

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:380            测试通过:158

描述

设有n个城市,编号为0n-1m条单向航线的起点和终点由输入提供,寻找一条换乘次数最少的线路方案。

输入

第一行为三个整数nmv,表示城市数、单向航线数和起点城市。以下m行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。2n201m190

输出

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值