一、廣度優先遍歷
上次我們淺談了圖的深度優先遍歷,接下來我們使用廣度優先搜索來遍歷這個圖:
這五個頂點被訪問的順序如下圖所示:
二、實現過程
廣度優先搜索過程如下:
- 首先以一個未被訪問過的頂點作為起始頂點,比如以1號頂點為起點。
- 將1號頂點放入到隊列中,然后將與1號頂點相鄰的未訪問過的頂點,即2號、3號和5號頂點依次放入到隊列中。
- 接下來再將2號頂點相鄰的未訪問過的4號頂點放入到隊列中。
- 到此所有頂點都被訪問過,遍歷結束。
廣度優先遍歷的主要思想:
- 首先以一個未被訪問過的頂點作為起始頂點,訪問其所有相鄰的頂點;
- 然后對每個相鄰的頂點,再訪問它們相鄰的未被訪問過的頂點;
- 直到所有頂點都被訪問過,遍歷結束。
三、完整代碼如下
#include<stdio.h> int main() { int i,j,n,m,a,b,cur,book[101]={0},e[101][101]; int que[10001],head,tail; scanf("%d %d",&n,&m); //初始化二維矩陣 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=0; else e[i][j]=99999999; //表示正無窮 //讀入頂點之間的邊 for(i=1;i<=m;i++) { scanf("%d %d",&a,&b); e[a][b]=1; e[b][a]=1; } //隊列初始化 head=1; tail=1; //從1號頂點出發,將1號頂點加入隊列 que[tail]=1; tail++; book[1]=1; //標記1號頂點已訪問 //當隊列不為空時循環 while(head<tail && tail<=n) { cur=que[head]; //當前正在訪問的頂點編號 for(i=1;i<=n;i++) //從1~n依次嘗試 { //判斷從頂點cur到頂點i是否有邊,並且頂點i沒有被訪問過,則將頂點i入隊 if(e[cur][i]==1 && book[i]==0){ que[tail]=i; tail++; book[i]=1; //標記頂點i已訪問 } //如果tail大於n,則表明所有頂點都已經被訪問過 if(tail>n) { break; } } head++; //當一個頂點擴展結束后,執行head++才能繼續往下擴展 } for(i=1;i<tail;i++) printf("%d ",que[i]); getchar();getchar(); return 0; }