圖的廣度優先遍歷(鄰接表)
阿新 • • 發佈:2018-12-12
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> using namespace std; #define MAX 100 typedef struct EdgeNode// 邊表結點 { int adjves;//儲存頂點的下標 struct EdgeNode* next;//連線下一個鄰點 }EdgeNode; typedef struct VertexNode//頂點表結點 { int ves;//頂點的值 EdgeNode* firstedge;//相連的頂點的值 }VertexNode,AdjList[MAX]; //鄰接表 typedef struct { AdjList adjlist; int ves;//頂點 int edge;//邊 int book[MAX];//判斷是否有被訪問過 }MGraph; void createMGraph(MGraph *G) { int i; int start; int end; EdgeNode *e; printf("please input the ves and edge:\n"); scanf("%d%d",&(G->ves),&(G->edge));//初始化 printf("please input the ves:\n");//此處設定頂點與儲存下標相同且從零開始 for(i = 0; i < G->ves; i++)//輸入頂點 { scanf("%d",&(G->adjlist[i].ves)); G->adjlist[i].firstedge = NULL; } //建立鄰接矩陣 printf("please input the edges:\n"); for(i = 0; i < G->edge; i++) { scanf("%d%d",&start,&end); e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空間 e->adjves = end; e->next = G->adjlist[start].firstedge; G->adjlist[start].firstedge = e;//類似於連結串列的前插 e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空間 e->adjves = start; e->next = G->adjlist[end].firstedge; G->adjlist[end].firstedge = e;//類似於連結串列的前插 } } void bfs(MGraph *G,int ves) { queue<VertexNode> Q; Q.push(G->adjlist[ves]); G->book[ves] = 1; while(!Q.empty()){ VertexNode tmp = Q.front(); printf("%d ", tmp.ves); Q.pop(); EdgeNode *p = tmp.firstedge; while(p != NULL){ if(G->book[p->adjves] == 0){ Q.push(G->adjlist[p->adjves]); G->book[p->adjves] = 1; } p = p->next; } } } void bfsTraverse(MGraph *G){ int i; memset(G->book,0,sizeof(G->book));//清空標誌位 for(i = 0; i < G->ves; i++) if(!G->book[i]) bfs(G, i); } int main() { MGraph G; createMGraph(&G); bfsTraverse(&G); return 0; } /* 輸入樣例: 7 9 0 1 2 3 4 5 6 0 2 0 3 0 4 1 3 1 5 2 3 2 5 4 5 5 6 */
輸入樣例:給定圖如下
在關於bfs的程式碼編寫的時候發現了自己 ->操作符和 .操作符亂用,下面作出說明:
比如你有這個結構體:
struct xx { int a; int b; }yy, *kk;
那麼使用如下:
yy.a = 3, yy.b = 5; kk = new xx; kk->a = 4, kk->b = 6;
也就是說你用結構體定義了一個實體,那麼這個實體要引用他裡面的成員,就用.操作符
如果你用結構體定義的是一個結構指標,那麼要引用他裡面的成員就用->
typedef struct VertexNode//頂點表結點 { int ves;//頂點的值 EdgeNode* firstedge;//相連的頂點的值 }VertexNode,AdjList[MAX]; . . . void bfs(MGraph *G,int ves) { queue<VertexNode> Q; Q.push(G->adjlist[ves]); G->book[ves] = 1; while(!Q.empty()){ VertexNode tmp = Q.front(); printf("%d ", tmp.ves); Q.pop(); EdgeNode *p = tmp.firstedge; while(p != NULL){ if(G->book[p->adjves] == 0){ Q.push(G->adjlist[p->adjves]); G->book[p->adjves] = 1; } p = p->next; } } }
結合上述程式碼,VertexNode 結構體中定義了AdjList[MAX]實體陣列
所以佇列宣告為 queue<VertexNode> Q; 而不是 queue<VertexNode*> Q;
所以類似宣告 VertexNode tmp = Q.front();
繼而 tmp 的相關操作使用操作符 .