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

//题目描述:第一行第一个数n代表有n个城市,第二个数m代表有m个航班,接下来两个数代表起点和终点

//接下来m行,每行3个数表示c到d有航班,注意两个城市之间的航班可以互相到达,求最少转机次数

#include <cstdio>

#include <iostream>

#include <queue>

using namespace std;

int book[101];

int a[101][101];

int n;

int start;

int en;

struct hang

{

   int number;

   int step;

};

queue<hang>q;

int main()

{

    int m,i,j,c,d;

    hang temp,temp2;

    scanf(“%d%d%d%d”,&n,&m,&start,&en);

    for (i=1;i<=n;i++)

        for (j=1;j<=n;j++)

        if (i==j)a[i][j]=0;

        else a[i][j]=100000;

        for (i=1;i<=m;i++)

        {

        scanf(“%d%d”,&c,&d);

        a[c][d]=1;

        a[d][c]=1;

        }

        book[start]=1;

        temp.number=start;

        temp.step=0;

        q.push(temp);

        while (!q.empty())

        {

            temp=q.front();

            if (temp.number==en)

            {

            printf(“%d\n”,temp.step);

            return 0;

            }

            q.pop();

            for (i=1;i<=n;i++)

                if ((a[i][temp.number]==1)&&(book[i]==0))

            {

                book[i]=1;

                temp2.number=i;

                temp2.step=temp.step+1;

                q.push(temp2);

            }

        }

        printf(“caoont reach\n”);

        return 0;

}

//应该可以看出此题与城市地图还是有很大不同的,那么如何区分呢?

//相同权值–宽度优先搜索–用结构体储存step–不用清除book[i]

//不同权值–深度优先搜索–递归step–需要清除book[i]

//如何理解:相同权值扩展都少次就是最少步数,而且一个节点只可能访问一次,因为第一次访问该节点所用步数一定最少,以后就可以不用考虑了,同时用队列实现,所以不能递归步数,要用结构体

//不同权值即使扩展次数较少,也不一定是最少步数,所以每个点可能多次访问,book[i]需要清除

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