圖的遍歷之廣度優先遍歷BFS

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");
}

 

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