最少转机

来源:互联网 发布:java开发实战经典 目录 编辑:程序博客网 时间:2024/06/12 01:10

题意:小哼和小哈一起坐飞机旅游,他们现在位于1号城市,目标是5号城市,可是1号城市没有到5号城市直航,不过他们收集了很多航班信息,现在他们要找出转机次数最少的方案。。。。。

样例:

5 7 1 5

1 2

1 3

2 3

2 4

3 4

3 5

4 5

第一行的5表示有5个城市(编号为1~5),7表示有7条航线,1表示起始城市,5表示目标城市,接下来的每行“a b”,表示a,b之间有航线,也就是a,b之间可以相互到达。。。

思路:这是一个无向图,故用广度优先搜索。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct bb
{
    int x,y;  //x为城市的编号,y为转机次数
}now,nex;
int main()
{
    int e[60][60]={0},book[60]={0};
    int n,m,a,b,sx,end;
    scanf("%d%d%d%d",&n,&m,&sx,&end);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
    {
        if(i==j) e[i][j]=0;  //如果相等则为0

        else e[i][j]=99999999;  //否则赋为99999999
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        e[a][b]=1;       //注意这里是无向图,双向的。。。。。
        e[b][a]=1;
    }
    queue<bb>q;   //初始化队列
    now.x=sx; 
    book[sx]=1;
    now.y=0;
    q.push(now);
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        for(int j=1;j<=n;j++)
        {
            if(e[now.x][j]!=99999999&&book[j]==0)   //从j到此时有航班且不在队列中,没被访问过,即为1
            {
                book[j]=1;
                nex.x=j;
                nex.y=now.y+1;
                q.push(nex);
            }
            if(nex.x==end)
            {
                break;
            }
        }
    }
    printf("%d\n",nex.y);
}


0 0
原创粉丝点击