GraphBasicOperation.cpp文件鏈接:https://blog.csdn.net/qq_16261421/article/details/106005857
廣度優先搜索遍歷的過程是:
(1)訪問初始點v,接着訪問v的所有未被訪問過的鄰接點v1,v2,…,vt。
(2)按照v1,v2,…,vt的次序,訪問每一個頂點的所有未被訪問過的鄰接點。
(3)依次類推,直到圖中所有和初始點v有路徑相通的頂點都被訪問過爲止。
廣度優先遍歷體現先進先出的特點,用隊列實現。
以鄰接表爲存儲結構,用廣度優先搜索遍歷圖時,需要使用一個隊列,以類似於按層次遍歷二叉樹遍歷圖。對應的算法如下(其中,v是初始頂點編號):
例如,以上圖的鄰接表爲例調用BFS()函數,假設初始頂點編號v=2,給出調用BFS()的執行過程。
代碼實現如下:
#include "GraphBasicOperation.cpp"
void BFS(ALGraph *G,int v)
{
ArcNode *p;
int queue[MAXV],front=0,rear=0; //定義循環隊列並初始化
int visited[MAXV]; //定義存放結點的訪問標誌的數組
int w,i;
for (i=0;i<G->n;i++) visited[i]=0; //訪問標誌數組初始化
printf("%2d",v); //輸出被訪問頂點的編號
visited[v]=1; //置已訪問標記
rear=(rear+1)%MAXV;
queue[rear]=v; //v進隊
while (front!=rear) //若隊列不空時循環
{
front=(front+1)%MAXV;
w=queue[front]; //出隊並賦給w
p=G->adjlist[w].firstarc; //找與頂點w鄰接的第一個頂點
while (p!=NULL)
{
if (visited[p->adjvex]==0) //若當前鄰接頂點未被訪問
{
printf("%2d",p->adjvex); //訪問相鄰頂點
visited[p->adjvex]=1; //置該頂點已被訪問的標誌
rear=(rear+1)%MAXV; //該頂點進隊
queue[rear]=p->adjvex;
}
p=p->nextarc; //找下一個鄰接頂點
}
}
printf("\n");
}
void main()
{
int i,j;
MGraph g;
ALGraph *G;
int A[MAXV][5]={
{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}};
g.n=5;g.e=16;
for (i=0;i<g.n;i++)
for (j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
G=(ALGraph *)malloc(sizeof(ALGraph));
MatToList(g,G);
printf(" 鄰接表:\n");DispAdj(G);
printf("廣度優先序列:");BFS(G,2);printf("\n");
}