圖的廣度優先遍歷演算法運用佇列主針對鄰接表有向圖
阿新 • • 發佈:2019-01-10
原始碼如下:
</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">
程式執行結果圖: