欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)廣度優(yōu)先遍歷圖

 更新時(shí)間:2021年09月16日 15:58:56   作者:Kayla小可愛  
這篇文章主要為大家詳細(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);    //讓開始序列入棧
    parent[start] = start;      // 開始節(jié)點(diǎn)的父節(jié)點(diǎn)是開始節(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并沒有訪問過
            if(!visited[graph[v][i]]) {

                // 如果這個(gè)沒有訪問過的節(jié)點(diǎn)沒有被看過
                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)訪問過,令seen=1.
                    seen[graph[v][i]] = 1;
                }
            }
            else {

                // 如果節(jié)點(diǎn)已經(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é)點(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] = 從開始到I節(jié)點(diǎn)的最短距離shortest distance of 'i' from 'start'.
       - If seen[i] == 1, 節(jié)點(diǎn)i已經(jīng)進(jìn)入過隊(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)入過隊(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)是否訪問過

    int start = 0;      // 開始節(jié)點(diǎn)
    bfs(start, parent, dist, seen, visited);

    return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++讀取單個(gè)字符操作示例詳解

    C++讀取單個(gè)字符操作示例詳解

    這篇文章主要為大家介紹了C++讀取單個(gè)字符操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • C語(yǔ)言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)

    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ǔ)言文件讀寫示例(c語(yǔ)言文件操作)

    c語(yǔ)言文件讀寫示例(c語(yǔ)言文件操作)

    這篇文章主要介紹了c語(yǔ)言文件讀寫示例(c語(yǔ)言文件操作),需要的朋友可以參考下
    2014-02-02
  • 詳解C語(yǔ)言之預(yù)處理(上)

    詳解C語(yǔ)言之預(yù)處理(上)

    這篇文章主要介紹了C語(yǔ)言程序的預(yù)處理,小編覺得這篇文章寫的還不錯(cuò),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • C++?Date類的具體使用(構(gòu)建,重載等)

    C++?Date類的具體使用(構(gòu)建,重載等)

    本文主要介紹了C++?Date類的具體使用(構(gòu)建,重載等),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)桌面貪吃蛇小游戲

    C語(yǔ)言實(shí)現(xiàn)桌面貪吃蛇小游戲

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)桌面貪吃蛇小游戲,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • C++中vector和map的刪除方法(推薦)

    C++中vector和map的刪除方法(推薦)

    下面小編就為大家?guī)硪黄狢++中vector和map的刪除方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • 詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符

    詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符

    這篇文章主要介紹了C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++中fstream,ifstream及ofstream用法淺析

    C++中fstream,ifstream及ofstream用法淺析

    這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下
    2014-08-08
  • Libevent的使用及reactor模型詳解

    Libevent的使用及reactor模型詳解

    Libevent?是一個(gè)用C語(yǔ)言編寫的、輕量級(jí)的開源高性能事件通知庫(kù),主要有以下幾個(gè)亮點(diǎn):事件驅(qū)動(dòng)(?event-driven),高性能;輕量級(jí),專注于網(wǎng)絡(luò),這篇文章主要介紹了Libevent的使用及reactor模型,需要的朋友可以參考下
    2024-03-03

最新評(píng)論