图的遍历之BFS广度优先遍历C++实现

首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。

广度优先遍历更加适用于所有边的权值相同的情况

《图的遍历之BFS广度优先遍历C++实现》

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int points,edgs;
	cin>>points>>edgs;
	int p1,p2;
	int flag[10];
	int edg[10][10];
	int infinity=99999999;
	for (int i=1;i<=points;i++)
	{
		for (int j=1;j<=points;j++)
		{
			if (i==j)
			{
				edg[i][j]=0;
			}
			else

			{
				edg[i][j]=infinity;
			}
		}
	}
	for (i=1;i<=edgs;i++)
	{
		cin>>p1>>p2;
		edg[p1][p2]=1;
		edg[p2][p1]=1;
		flag[i]=0;
	}
	flag[1]=1;
	int cur;
	int qi[10];
	int head=1;
	int tail=1;
	qi[tail]=1;
	tail++;
	while (head<tail)
	{
		cur=qi[head];
		for (i=1;i<=points;i++)
		{
			if (edg[cur][i]==1&&flag[i]==0)//如果访问到起始点的相邻点,则相邻点入对
			{							  //一轮结束再从相邻点寻找其相邻点直到所有点访问结束
				qi[tail]=i;
				tail++;
				flag[i]=1;
			}
			if (tail>points)
			{
				break;
			}
		}
		head++;
	}
	for (i=1;i<tail;i++)
	{
		cout<<qi[i]<<" ";
	}
	cout<<endl;
}

输出结果:

《图的遍历之BFS广度优先遍历C++实现》

图的广度优先遍历应用——最少转机:1号城市坐飞机到5号城市,希望找到一种乘坐方式,使得转机的次数最少。

《图的遍历之BFS广度优先遍历C++实现》

#include<iostream>
#include<queue>
using namespace std;
struct note
{
	int number;
	int count;
};
int main()
{
	int points,edgs;
	cin>>points>>edgs;
	int start,end;
	cin>>start>>end;
	int p1,p2;
	int flag[10];
	int edg[10][10];
	int infinity=99999999;
	for (int i=1;i<=points;i++)
	{
		for (int j=1;j<=points;j++)
		{
			if (i==j)
			{
				edg[i][j]=0;
			}
			else
				
			{
				edg[i][j]=infinity;
			}
		}
	}
	for (i=1;i<=edgs;i++)
	{
		cin>>p1>>p2;
		edg[p1][p2]=1;
		edg[p2][p1]=1;
		flag[i]=0;
	}
	flag[1]=1;
	int cur;
	struct note qi[10];
	int head=1;
	int tail=1;
	qi[tail].number=start;
	qi[tail].count=0;
	tail++;
	int f=0;
	while (head<tail)
	{
		cur=qi[head].number;
		for (i=1;i<=points;i++)
		{
			if (edg[cur][i]==1&&flag[i]==0)//如果访问到起始点的相邻点,则相邻点入对
			{							  //一轮结束再从相邻点寻找其相邻点<span style="white-space:pre">										</span>  //直到所有点访问结束
				qi[tail].number=i;
				qi[tail].count=qi[head].count+1;
				tail++;
				flag[i]=1;
			}
			if (qi[tail-1].number==end)//因为tail指的是队列末位的下一位所以判断要减1得出末尾的前一位
			{
				f=1;
				break;
			}
		}
		if (f==1)
		{
			break;
		}
		head++;
	}
	
	cout<<qi[tail-1].count<<endl;
}

输出结果:

《图的遍历之BFS广度优先遍历C++实现》

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