圖的深度優先遍歷和廣度優先遍歷程式碼實現
阿新 • • 發佈:2019-01-08
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <queue> using namespace std; typedef char TypeData; /* 資料型別 */ #define MAXVEX 100 /* 最大頂點數 */ #define INFINITY 65535 /* 用65535代表 正無窮 */ /* 儲存採用鄰接矩陣 */ typedef struct stGraph { TypeData vexs[MAXVEX]; /* 定點表 */ int arc[MAXVEX][MAXVEX]; /* 鄰接矩陣,可看作邊表 */ int numVertexes, numEdges;/* 圖中當前的頂點數和邊數 */ }MGraph; /* 建立無向網圖鄰接矩陣表示 */ void createMGraph(MGraph* G); /* 鄰接矩陣的深度優先遞迴演算法,針對每一個定點進行深度優先遍歷 */ void DFS(MGraph* G, int i); void DFSTraverse(MGraph* G); /* 鄰接矩陣的廣度優先遍歷 */ void BFSTraverse(MGraph* G); /* 建立無向網圖鄰接矩陣表示 */ void createMGraph(MGraph* G) { int i = 0, j = 0, k = 0, w = 0; cout << "請輸入定點數和邊數: "; cin >> G->numVertexes >> G->numEdges; /* 讀入定點資訊,建立定點表 */ cout << "請輸入圖的節點" << endl; for(i = 0; i < G->numVertexes; i++) { cin >> G->vexs[i]; } /* 初始化鄰接矩陣 */ for(i = 0; i < G->numVertexes; i++) { for(j = 0; j < G->numVertexes; j++) { G->arc[i][j] = INFINITY; } } /* 讀入numEdges邊資訊 */ for(k = 0; k < G->numEdges; k++) { cout << "輸入邊(vi,vj)上的下標,i,j和權值w" << endl; cin >> i >> j >> w; G->arc[i][j] = w; /* 因為是無向圖,矩陣對稱 */ G->arc[j][i] = w; } } /* 鄰接矩陣的深度優先遍歷和廣度優先遍歷所用輔助陣列 記錄圖中的節點是否被訪問過 */ int visited[MAXVEX] = {0}; /* 鄰接矩陣的深度優先遞迴演算法,針對每一個定點進行深度優先遍歷 */ void DFS(MGraph* G, int i) { int j = 0; visited[i] = 1; /* 列印定點的資訊 */ cout << G->vexs[i] << " "; for(j = 0; j < G->numVertexes; j++) { if(G->arc[i][j] != 65535 && visited[j] == 0 ) { DFS(G,j); } } } void DFSTraverse(MGraph* G) { int i = 0; /* 把每一個定點都設為未訪問過 */ for(i = 0; i < G->numVertexes; i++) { visited[i] = 0; } /* 對未訪問過的定點呼叫DFS */ for(i = 0; i < G->numVertexes; i++) { if(visited[i] == 0) { DFS(G,i); } } } /* 鄰接矩陣的廣度優先遍歷 */ void BFSTraverse(MGraph* G) { int i = 0, j = 0; queue<int> myqueue; /* 初始化,把每一個定點都設為未訪問過 */ for(i = 0; i < G->numVertexes; i++) { visited[i] = 0; } /* 對每一個定點做迴圈 */ for(i = 0; i < G->numVertexes; i++) { /* 如果節點沒有被訪問過 */ if(visited[i] == 0) { /* 該節點設定為已經被訪問 */ visited[i] = 1; /* 打印出該節點,並把該節點入佇列 */ cout << G->vexs[i] << " "; myqueue.push(i); /* 若當前的佇列不為空 */ while(!myqueue.empty()) { i = myqueue.front(); myqueue.pop(); for(j = 0; j < G->numVertexes; j++) { /* 判斷其他定點若與當前的定點存在邊且未訪問過 */ if(G->arc[i][j] != 65536 && visited[j] == 0) { visited[j] = 1; cout << G->vexs[j] << " "; myqueue.push(j); } } } } } } int main(void) { MGraph* pGraph = new MGraph; int i = 0, j = 0; /* 建立一個圖 */ createMGraph(pGraph); /* 深度優先遍歷 */ // DFSTraverse(pGraph); /* 廣度優先遍歷 */ BFSTraverse(pGraph); delete pGraph; return 0; }