C++實現(xiàn)廣度優(yōu)先遍歷圖
更新時間:2021年09月16日 15:58:56 作者:Kayla小可愛
這篇文章主要為大家詳細介紹了C++實現(xiàn)廣度優(yōu)先遍歷圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)廣度優(yōu)先遍歷圖的具體代碼,供大家參考,具體內(nèi)容如下
廣度優(yōu)先遍歷
void bfs(int start, int parent[], int dist[], int seen[], int visited[]) { std::queue <int> q;//建立數(shù)據(jù)隊列q int v; q.push(start); //讓開始序列入棧 parent[start] = start; // 開始節(jié)點的父節(jié)點是開始節(jié)點 dist[start] = 0; // 初始化距離向量為-1 seen[start] = 1; while(!q.empty()) { //如果隊列非空 v = q.front(); q.pop(); //令V是隊列的最前端,并將其出棧 if(visited[v]) // 如果visited[v]=1, continue. continue; visited[v] = 1; //否則令visited[v]=1 std::cout << v << '\n';//輸出顯示當前節(jié)點 // 遍歷v的所有相鄰節(jié)點 for(int i = 0; i < graph[v].size(); i++) { // 如果v的第i個相鄰節(jié)點的i并沒有訪問過 if(!visited[graph[v][i]]) { // 如果這個沒有訪問過的節(jié)點沒有被看過 if(!seen[graph[v][i]]) { //壓入棧,距離+1,設置父節(jié)點 q.push(graph[v][i]); dist[graph[v][i]] = 1 + dist[v]; parent[graph[v][i]] = v; // 如果已經(jīng)訪問過,令seen=1. seen[graph[v][i]] = 1; } } else { // 如果節(jié)點已經(jīng)被訪問了,選擇距離最小的 if(dist[v] + 1 < dist[graph[v][i]]) { dist[graph[v][i]] = 1 + dist[graph[v][i]]; parent[graph[v][i]] = v; } } } } }
主函數(shù)
int main() { int n = 8; // 圖中的節(jié)點數(shù) graph = std::vector <std::vector <int> > (n); // 圖的鄰接表 graph[0] = {1, 2}; graph[1] = {0, 2, 3}; graph[2] = {0, 1, 5, 6}; graph[3] = {1, 2, 4}; graph[4] = {3}; graph[5] = {2}; graph[6] = {2, 7}; graph[7] = {6}; /* - parent[i] = parent of 'i' in BFS traversal. - dist[i] = 從開始到I節(jié)點的最短距離shortest distance of 'i' from 'start'. - If seen[i] == 1, 節(jié)點i已經(jīng)進入過隊列'i' has entered the queue once - If visited[i] == 1, 節(jié)點i已經(jīng)進入隊列,并且所有相鄰節(jié)點都已經(jīng)進入過隊列 */ int parent[n+1], dist[n+1], seen[n+1], visited[n+1]; memset(parent, -1, sizeof(parent));//父節(jié)點初始化為-1 memset(dist, -1, sizeof(dist));//距離向量初始化為-1 memset(seen, 0, sizeof(seen)); memset(visited, 0, sizeof(visited));//seen用于判斷該節(jié)點是否訪問過 int start = 0; // 開始節(jié)點 bfs(start, parent, dist, seen, visited); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)父進程主動終止子進程的方法總結(jié)
一般的情況,子進程自己運行完后,執(zhí)行exit 或者return 后,父進程wait. waitpid收回子進程,但子進程是一個循環(huán)等待狀態(tài)不主動退出,父進程可以采用文中介紹的幾種方法,需要的朋友可以參考下2023-10-10C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學者學習文件流的操作,需要的朋友可以參考下2014-08-08