最少转机-图的广度优先遍历

题目描述:

小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有到5号城市的直航。

不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决?

输入:

第一行输入n,m,n表示城市的数量,m表示城市间的的航线,城市编号从1-n。

接下来m行输入每两个城市间的航线

最后一行输入起点城市和终点城市

样例:

5  7

1  2

1  3

2  3

2  4

3  4

3  5

4  5

1  5

样例结果输出:

2

代码:

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
int e[50][50],book[50];
struct note{
 int x;//城市编号
 int s;//转机次数
}que[2500];
void init()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
              e[i][j]=0;
            else
              e[i][j]=INF; //i,j城市间没有通路
        }
    }
}
int main()
{
    int head,tail,st,ed,cur;
    int i,j,flag,n,m;
    scanf("%d%d",&n,&m);
    init();
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        e[a][b]=1;
        e[b][a]=1;
    }
    head=tail=1;
    scanf("%d%d",&st,&ed);
    que[tail].x=st; que[tail].s=0;
    tail++;
    book[s]=1;
    while(head<tail)
    {
        cur=que[head].x; //当前队列中首城市的编号
        for(j=1;j<=n;j++) //从1-n依次尝试
        {
            //从城市cur到城市j是否有航班并且判断城市j是否在队列中
            if(e[cur][j]!=INF&&book[j]==0)
            {
               //如果从城市cur到城市j有航班并且城市j不在队列中,则将j号城市入列
               que[tail].x=j;
               que[tail].s=que[head].s+1; //转机次数加1
               tail++;
               //标记城市j已经在队列中
               book[j]=1;
            }
            //如果到达目标城市,停止扩展,任务结束,退出循环
            if(que[tail].x==ed)
            {
               flag=1;
               break;
            }
        }
        if(flag==1)
            break;
        head++;
      }
    printf("%d\n",que[tail-1].s);
    return 0;
}

                                                                                                                                                              摘自《啊哈!算法》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/ZCMU_2024/article/details/81109787
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞