1. 程式人生 > >圖的廣度優先遍歷演算法運用佇列主針對鄰接表有向圖

圖的廣度優先遍歷演算法運用佇列主針對鄰接表有向圖

原始碼如下:
</pre><pre name="code" class="objc">#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
typedef int EdgeData;  
typedef char VertexData; //頂點資料域 

typedef struct node {  //  邊表節點 
     EdgeData cost; //邊上d權值
     int adjvex;   //鄰接點域 
     struct node *next; //下一邊連結指標 
}EdgeNode;  

typedef struct {  //  頂點表 
     VertexData vertex; //頂點資料域 
     EdgeNode *firstEdge; // 邊連結串列頭指標
}VertexNode;  

typedef struct {  //  圖的鄰接表 
     VertexNode verlist[MAX_VERTEX_NUM] ; 
     int vexnum,edgenum; //頂點數和邊數
}AdjGraph;  

//---------以上是圖的鄰接表資料結構------------------------//

typedef struct QUEUEnode* link;
struct QUEUEnode{
	int item ;
	link next;
};

static link head , tail;

link NEW(int item, link next){
	link x = new QUEUEnode ;
	x->item = item;
	x->next = next;
	return x;
}

void QUEUEinit(int maxN){
	head = NULL;
}

int QUEUEempty(){
	return head == NULL;
} 

void  QUEUEput(int item){
	if(head == NULL){
		head =(tail = NEW(item,head)) ;
		return;
	}
	tail->next = NEW(item,tail->next);
	tail = tail->next;
}

int QUEUEget(){
	int item = head->item;
	link t = head->next;
	delete head;
	head = t;
	return item;
} 

//--------------以上的佇列的資料結構-----------------------// 

 

void printAdjGraph(AdjGraph G){
	cout<<"得到的有向圖如下:"<<endl;
	int i ;
	for(i = 0;i<G.vexnum;i++){
		cout<<G.verlist[i].vertex<<"-->";
		EdgeNode *e = G.verlist[i].firstEdge;
		while(e!=NULL){
		cout<<e->adjvex<<"-->";
			e = e->next; 
		}
		cout<<endl;
	} 
}

//建立圖的鄰接表 
AdjGraph createAdjGraph(AdjGraph G){ 
	int i,j,k,w;
	cout<<"輸入頂點數和邊數"<<endl;
	cin>>G.vexnum>>G.edgenum;
	cout<<"輸入頂點資訊"<<endl;
	for(i = 0 ; i<G.vexnum;i++){
		cin>>G.verlist[i].vertex;
		G.verlist[i].firstEdge = NULL; //將邊表置為空表 
	}
	EdgeData weight;
	int head;
	int tail;
	cout<<"輸入第tail號邊表的前端索引head,和權值weight,如(tail head weight)"<<endl;
	 for(k=0;k<G.edgenum;k++){
	 	cin>>tail>>head>>weight;
	 	EdgeNode *p = new EdgeNode;
	 	p->adjvex = head;
		p->cost = weight;
		p->next = G.verlist[tail].firstEdge;
		G.verlist[tail].firstEdge = p;    // 一條邊是 tail---->head 
		
		//建立無向圖的話就再加上下面的程式碼 
//		p = new EdgeNode;
//	 	p->adjvex = tail;
//		p->cost = weight;
//		p->next = G.verlist[head].firstEdge;
//		G.verlist[head].firstEdge = p;
		if(k==G.edgenum-1)
			printAdjGraph(G);
	 }
	 return G;
	 
}

bool visited[MAX_VERTEX_NUM] ;  
int dfn[MAX_VERTEX_NUM]; //頂點的先深編號 
int count = 1;
void BFS1(AdjGraph G,int K){
	int i; 
	EdgeNode *p;
	QUEUEinit(40);
	cout<<G.verlist[K].vertex<<endl;
	visited[K] = true;
	QUEUEput(K);
	while(!QUEUEempty()){
		i = QUEUEget();
		p = G.verlist[i].firstEdge;
		while(p){
			if(!visited[p->adjvex]){
				cout<<G.verlist[p->adjvex].vertex<<endl;
				visited[p->adjvex] = true;
				QUEUEput(p->adjvex);
			}
			p = p->next;
		}
	} 
	
	//若是鄰接矩陣則用下面的程式替代while(p)程式段 
//	int j;
//	while(!QUEUEempty()){
//		i = QUEUEget();
//		for(j=0;j<G.vexnum;j++)
//			if(G.edge[i][j]==1 && !visited[j]){
//				cout<<G.verlist[j]<<endl;
//				visited[j] = true;
//				QUEUEput(j);
//			}
//	} 
	
	//---------以下是圖的鄰接矩陣資料結構-------------//
//#define MAX_VERTEX_NUM 20
//typedef int QElemType; 
//typedef int EdgeData;
//typedef char VertexData;
//typedef struct 
//{
//    VertexData verlist[MAX_VERTEX_NUM];            //頂點表
//     EdgeData edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //鄰接矩陣--可試為邊之間的關係 
//     int vexnum,edgenum;                          //頂點數和邊數
//}MTGraph;
	

	
} 

//廣度優先遍歷主程式 
void BFSTraverse(AdjGraph G){
	int i ; 
	for(i=0;i<G.vexnum;i++)
		 visited[i]=false;
	for(i=0;i<G.vexnum;i++)
		if(!visited[i])
			BFS1(G,i);
} 


main(){
	AdjGraph G ;
	G = createAdjGraph(G);
	cout<<"廣度優先遍歷的結果:"<<endl;
	BFSTraverse(G);
	system("pause");
}
</pre><pre name="code" class="objc">

程式執行結果圖: