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

