廣度優先搜索(BFS)遍歷設計思想:
- 訪問頂點v;
- 訪問頂點v的所有未被訪問過的鄰接點,假設訪問次序是Vi1,Vi2,…,Vit;
- 按Vi1,Vi2,…,Vit的次序,訪問每個頂點的所有未被訪問過的鄰接點,直到圖中所有和初始點v有路徑相通的頂點都被訪問過爲止。
BFS的具體分析:
- 從V0出發,V0首先被訪問,訪問完畢以後,它的鄰接點是1和3,按照廣度優先遍歷的策略,應該先訪問V1,緊接着再訪問V3。
- 一旦V3被訪問完畢以後,此時應訪問V1的鄰接點。
- 而V1的鄰接點有V0和V2,V0已被訪問過,那麼我們只需訪問V2即可。
- 一旦V1的鄰接點全部被訪問完畢以後,緊接着再考慮V3的。
- V3的鄰接點有0,2,4。0已被訪問過,而2沒有,所以緊接着訪問V2,接着再訪問V4.
- 一旦訪問完畢以後,發現V1鄰接點的V0和V2全部被訪問。而V0和V2鄰接點也全被訪問過。至此,整個廣度優先搜索的遍歷結束。
- 最後輸出的序列是:
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++實現