最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++詳細講解圖的遍歷

 更新時間:2022年05月30日 11:08:24   作者:quicklsleap  
圖的遍歷是指,從給定圖中任意指定的頂點(稱為初始點)出發(fā),按照某種搜索方法沿著圖的邊訪問圖中的所有頂點,使每個頂點僅被訪問一次,這個過程稱為圖的遍歷

圖的遍歷

要想遍歷圖,肯定要先儲存圖啊。

下面我們采用鄰接表來存圖

也可以看: 點這里

1.用 h 數組保存各個節(jié)點能到的第一個節(jié)點的編號。開始時,h[i] 全部為 -1。

2.用 e 數組保存節(jié)點編號,ne 數組保存 e 數組對應位置的下一個節(jié)點所在的索引。

3.用 idx 保存下一個 e 數組中,可以放入節(jié)點位置的索引

4.插入邊使用的頭插法,例如插入:a->b。首先把b節(jié)點存入e數組,e[idx] = b。然后 b 節(jié)點的后繼是h[a],ne[idx] = h[a]。最后,a 的后繼更新為 b 節(jié)點的編號,h[a] = idx,索引指向下一個可以存儲節(jié)點的位置,idx ++ 。

模板如下:

//鄰接表
const int N = 100010, M = N * 2;
//無向圖n條邊時,最多2n個idx,因為每條邊在鄰接表中會出現兩次
int h[N], e[M], ne[M], idx;
//n個鏈表頭,e每一個結點的值,ne每一個結點的next指針
void add(int a, int b)//a->b
{//e記錄當前點的值(地址->值),ne下一點的地址(地址->地址),h記錄指向的第一個點的地址(值->地址)
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}//頭插法
// 初始化
idx = 0;
memset(h, -1, sizeof h);

圖的深度優(yōu)先遍歷(DFS, depth first search)

方法:深度優(yōu)先搜索的遍歷順序為一條路徑走到底然后回溯再走下一條路徑這種遍歷方法很省內存但是不能一次性給出最短路徑或者最優(yōu)解。 

深度優(yōu)先遍歷的步驟

  1. 訪問頂點V
  2. 依次從頂點V的未被訪問的鄰節(jié)點出發(fā),進行深度優(yōu)先搜索,直至和V有路徑相通的頂點都被訪問到。
  3. 對于連通圖進行遍歷時,從一個頂點出發(fā)即可訪問圖中所有的頂點。
  4. 對于非連通圖進行遍歷時,若圖中尚有頂點未被訪問,則另選一未曾訪問的頂點作為起始點,進行深度優(yōu)先搜索,直至所有頂點都被訪問
// 需要標記數組st[N],  遍歷節(jié)點的每個相鄰的點
void dfs(int u) {
    st[u] = true; // 標記一下,記錄為已經被搜索過了,下面進行搜索過程
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
//因為每個節(jié)點的編號都是不一樣的,所以 用編號為下標 來標記是否被訪問過
        if (!st[j]) {
            dfs(j);
        }
    }
}

圖的寬度優(yōu)先遍歷(BFS, breadth first search)

方法:從圖的某一結點出發(fā),首先依次訪問該結點的所有鄰接頂點(再按這些頂點被訪問的先后次序依次訪問與它們相鄰接的所有未被訪問的頂點,重復此過程,直至所有頂點均被訪問為止。

從頂點V出發(fā)廣度優(yōu)先搜索的步驟

  1. 訪問頂點V
  2. 依次訪問頂點V的各個未被訪問的臨接點(橫向訪問)
  3. 從V的這些鄰接點出發(fā)依次訪問他們的鄰接點,致使“先被訪問的頂點的鄰接點先于"后訪問的頂點的鄰接點"被訪問(一般可以借助隊列實現),直至圖中所有已被訪問的頂點的鄰接點均被訪問。
  4. 對于非連通圖進行遍歷時,若圖中尚有頂點未被訪問,則另選一未曾訪問的頂點作為起始點,進行廣度優(yōu)先搜索,直至所有頂點都被訪問

模板及注釋

queue<int> q;//借助隊列實現
st[1] = true; // 表示1號點已經被遍歷過
q.push(1);//1號節(jié)點入隊列
while (q.size())//對列非空,就一直往后搜索
{
    int t = q.front();//隊頭出隊,找該點能到的點
    q.pop();//遍歷完就出隊列
    for (int i = h[t]; i != -1; i = ne[i])//遍歷所有t節(jié)點能到的點,i為節(jié)點索引
    {
        int j = e[i];//通過索引i得到t能到的節(jié)點編號
        if (!st[j])//如果沒有遍歷過
        {
            st[j] = true; // 表示點j已經被遍歷過
            q.push(j);//節(jié)點入隊
        }
    }
}

寬度優(yōu)先搜索BFS的應用

圖論算法中大量使用了BFS或類似的算法,其常見的應用如下:

1.求最短路徑路徑和最小生成樹,兩個頂點的最短路徑是指兩個頂點間含有最少頂點的路徑,另外最小生成樹也可以使用DFS。

2.P2P網絡中查找臨近的結點,應用場景如P2P文件下載,P2P語音視頻通信。

3.搜索引擎的網絡爬蟲的主要算法之一,DFS也是。

4.社交網絡網站,在社交網絡中可以搜索k層級以內查找一個人。

5.GPS導航系統(tǒng),使用BFS查找附近地點等。

6.網絡廣播,在網絡中使用BFS將廣播包發(fā)送給每個節(jié)點。 垃圾回收算法,例如Cheney算法。

7.無向圖環(huán)或圈檢測,BFS和DFS都可以檢測無向圖的環(huán)或圈,有向圖環(huán)檢測只能使用DFS。

8.查找最大流,如下面會談到的Ford-Fulkerson算法。

9.檢測一個圖是否是一個二分圖,DFS和BFS都可以。

10.路徑查找,使用BFS和DFS檢測兩個頂點是否有一條路徑,查找一個頂點到所有可達到的頂點等等。

深度優(yōu)先遍歷DFS的應用

DFS和BFS是圖論算法的主要算法,其應用非常多,下面是一些常見例子:

1.無權圖中求最短路徑和最小生成樹。

2.檢測環(huán)或圈。

3.路徑查找,使用DFS查找u到v的一條路徑,使用棧stack作為輔助,使用遞歸算法遇到目標頂點v則入棧,后面陸續(xù)入棧,打印內容即為所求路徑。

4.拓撲排序:計算機中根據作業(yè)之間的關系來調度作業(yè)(或根據一定先后順序優(yōu)先級等);計算機中的指令調度(先后順序);重新計算公式值公式單元的計算順序;邏輯合成;makefile編譯任務的執(zhí)行順序;數據序列化;編譯器中的鏈接器中解決符號依賴關系。

5.檢測一個圖是否是二分圖。

6.查找有向圖的強連通分量,后面會詳細討論其實現算法。

7.解決難題,如迷宮問題。

到此這篇關于C++詳細講解圖的遍歷的文章就介紹到這了,更多相關C++圖的遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言非遞歸算法解決快速排序與歸并排序產生的棧溢出

    C語言非遞歸算法解決快速排序與歸并排序產生的棧溢出

    上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現一個問題,快速排序和歸并排序我們都是用遞歸來實現的,可能有小伙伴會問,如果說數據量很多話,棧區(qū)空間會不會不夠用呢?這期我們就來解決使用遞歸實現的排序導致棧溢出如何解決
    2022-04-04
  • C++實現LeetCode(205.同構字符串)

    C++實現LeetCode(205.同構字符串)

    這篇文章主要介紹了C++實現LeetCode(205.同構字符串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++中replace()函數使用方法匯總

    C++中replace()函數使用方法匯總

    這篇文章主要介紹了C++中replace()函數使用方法匯總,在這篇文章中為大家詳細介紹C++ replace()函數的各種應用方式,希望朋友們可以從這里介紹的內容充分掌握這一應用技巧
    2015-11-11
  • 深入理解atoi()與itoa()函數的用法

    深入理解atoi()與itoa()函數的用法

    本篇文章是對atoi()與itoa()函數的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 純C語言:貪心Prim算法生成樹問題源碼分享

    純C語言:貪心Prim算法生成樹問題源碼分享

    這篇文章主要介紹了貪心Prim算法生成樹問題源碼,有需要的朋友可以參考一下
    2014-01-01
  • 解決C++全局變量只能初始化不能賦值的問題

    解決C++全局變量只能初始化不能賦值的問題

    今天小編就為大家分享一篇解決C++全局變量只能初始化不能賦值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C語言回溯法 實現組合數 從N個數中選擇M個數

    C語言回溯法 實現組合數 從N個數中選擇M個數

    在平時的算法的題目中,時常會遇到組合數相關的問題,暴力枚舉。在N個數中挑選M個數出來。利用for循環(huán)也可以處理,但是可拓展性不強,于是寫這個模板供以后參考
    2018-08-08
  • 淺析C++字節(jié)對齊容易被忽略的兩個問題

    淺析C++字節(jié)對齊容易被忽略的兩個問題

    今天我就和大家分享一下C++字節(jié)對齊容易被忽略的兩個問題。以下問題也是我實際開發(fā)工作中遇到的,如果有不同意見歡迎交流
    2013-07-07
  • C語言實現六邊形掃雷游戲的示例代碼

    C語言實現六邊形掃雷游戲的示例代碼

    所謂六邊形掃雷,就是沒有掃雷模式的消零算法,每一個安全的點都需要單獨挖出來,一次顯示一個格子,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 總結C/C++面試中可能會碰到的字符串指針題

    總結C/C++面試中可能會碰到的字符串指針題

    C/C++是最能體現程序員能力的語言之一,其功能強大,在IT行業(yè)的各個方面都有大量的應用。下面這篇文章主要介紹了總結了在C/C++面試中可能會碰到的字符串指針題,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01

最新評論

宜兴市| 湾仔区| 望都县| 南充市| 甘孜| 买车| 舒兰市| 吉木乃县| 张家口市| 汉寿县| 道真| 都匀市| 西城区| 平邑县| 濉溪县| 宁河县| 马鞍山市| 黔南| 丰原市| 定远县| 秦皇岛市| 北京市| 江山市| 南部县| 丹东市| 乌拉特前旗| 沙田区| 灯塔市| 和林格尔县| 抚顺市| 滨海县| 怀安县| 台北县| 葫芦岛市| 五莲县| 广灵县| 四会市| 郴州市| 临洮县| 凌云县| 孟村|