飞机最少换乘次数问题

  • Description

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

  • Input

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

  • Output

共n-1行,分别是从起点城市v到其他n-1个城市最少换乘次数,按照终点城市序号从小到大顺序输出,不能抵达时输出-1。

  • Sample Input

3 2 0
0 1
1 2

  • Sample Output

1
2

#include<iostream>
#include<algorithm>
using namespace std;
#define N 21
int map[N][N],ans[N],used[N],n,m,v;

void BFS()
{
    int que[10*N],front=0,rear=0,i,x;
    que[rear++]=v;
    ans[v]=0;
    while(front<rear)
    {
        x=que[front++];
        for(i=0;i<n;i++)
            if(i!=x && map[x][i] && !used[i])
            {
                que[rear++]=i;
                ans[i]=ans[x]+1;
                used[i]=1;
            }
    }
}


int main()
{
//    freopen("in.txt","r",stdin);
    int x,y,i;
    while(scanf("%d %d %d",&n,&m,&v)!=EOF)
    {
        memset(map,0,sizeof(map));
        memset(used,0,sizeof(used));
        memset(ans,-1,sizeof(ans));
        for(i=0;i<m;i++)
        {
            scanf("%d %d",&x,&y);
            map[x][y]=1;
        }
        BFS();
        for(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、付费专栏及课程。

余额充值