圖的遍歷——用鄰接表實現BFS

廣度優先搜索(BFS)遍歷設計思想:

  1. 訪問頂點v;
  2. 訪問頂點v的所有未被訪問過的鄰接點,假設訪問次序是Vi1,Vi2,…,Vit;
  3. 按Vi1,Vi2,…,Vit的次序,訪問每個頂點的所有未被訪問過的鄰接點,直到圖中所有和初始點v有路徑相通的頂點都被訪問過爲止。

BFS的具體分析:

在這裏插入圖片描述

  1. 從V0出發,V0首先被訪問,訪問完畢以後,它的鄰接點是1和3,按照廣度優先遍歷的策略,應該先訪問V1,緊接着再訪問V3。
  2. 一旦V3被訪問完畢以後,此時應訪問V1的鄰接點。
  3. 而V1的鄰接點有V0和V2,V0已被訪問過,那麼我們只需訪問V2即可。
  4. 一旦V1的鄰接點全部被訪問完畢以後,緊接着再考慮V3的。
  5. V3的鄰接點有0,2,4。0已被訪問過,而2沒有,所以緊接着訪問V2,接着再訪問V4.
  6. 一旦訪問完畢以後,發現V1鄰接點的V0和V2全部被訪問。而V0和V2鄰接點也全被訪問過。至此,整個廣度優先搜索的遍歷結束。
  7. 最後輸出的序列是:
    0 1 3 2 4

BFS的代碼實現:

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int points,edgs;  //points爲實際頂點數,edgs爲實際邊數 
	cin>>points>>edgs;
	int p1,p2;
	int flag[10];
	int edg[10][10];
	int infinity=99999999;
	int i,j;
	for (i=1;i<=points;i++)
	{
		for (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;
}

運行結果:
在這裏插入圖片描述

參考

中國大學MOOC 《數據結構》青島大學 劉遵仁
博客 圖的遍歷之BFS廣度優先遍歷C++實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章