1. 程式人生 > >圖的遍歷-廣度優先遍歷

圖的遍歷-廣度優先遍歷

廣度優先遍歷類似於樹的按層次遍歷的過程。

規則:訪問v,訪問v的各未訪問的鄰接點,之後逐個從這些鄰接點出發重複上述操作。待與v連通的頂點訪問畢再從另一頂點出發。

實現:對各個頂點v,若其尚未訪問則訪問,之後v入隊,隊頂元素出隊,逐個訪問其尚未訪問的鄰接點,每的訪問完一個便入隊。重複直到隊空。

演算法實現:

鄰接矩陣儲存:

void BFSTraverse(MGraph G,Status (*visit)(MGraph G,int v)){
	/*圖的廣度優先遍歷
	訪問v 訪問v的各為訪問的鄰接點 之後逐個從這些鄰接點出發重複上述操作
	待與v連通的頂點訪問畢再從另以頂點出發 對各個頂點v 若其尚未訪問則訪
	問v 之後v入隊 對頂元素出隊 逐個訪問其尚為訪問的鄰接點,每訪問完一個
	就入隊 重複直到佇列空
	每個頂點進一次隊 出隊時主要操作查詢鄰接點*/
   int v;
   LinkQueue Q;
   InitQueue(Q);
   for(v=0;v<G.vexnum;v++) //初始化
	  visited[v]=FALSE;
   for(v=0;v<G.vexnum;v++){
	  if(!visited[v]){
	      visit(G,v);
          visited[v]=TRUE;
          EnQueue(Q,v);
          while(!QueueEmpty(Q)){
			  DeQueue(Q,v);
	          for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) {
			      if(!visited[w]) {
				     visit(G,w);
			         visited[w]=TRUE;
				     EnQueue(Q,w);
				  }
			  }
		  }
	  }
   }
}

鄰接表儲存:

void BFSTraverse(ALGraph G,Status (*visit)(ALGraph G,int v)){
	/*圖的廣度優先遍歷
	訪問v 訪問v的各未訪問的鄰接點,之後逐個從這些鄰接點出發重複上述操作
	待與v連通的頂點訪問畢再從另以頂點出發 對各個頂點v 若其尚未訪問則訪
	問v 之後v入隊 對頂元素出隊 逐個訪問其尚為訪問的鄰接點,每訪問完一個
	就入隊 重複直到佇列空
	每個頂點進一次隊 出隊時主要操作查詢鄰接點*/
   int v,w;
   LinkQueue Q;
   InitQueue(Q);
   for(v=0;v<G.vexnum;v++)//初始化
      visited[v]=FALSE;
   for(v=0;v<G.vexnum;v++){
       if(!visited[v]){
	       visit(G,v);
	       visited[v]=TRUE;
	       EnQueue(Q,v);
	       while(!QueueEmpty(Q)){
		       DeQueue(Q,v);
		       for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
				  if(!visited[w]) {
				      visit(G,w);
	                  visited[w]=TRUE;
	                  EnQueue(Q,w);
				  }
			   }
		   }
	   }
   }
}