待完善。。。
目錄
-
圖的遍歷
- DFS圖的深度優先搜索遍歷
- 基本思想:
- 1⃣️首先訪問出發點v,並將其標記爲訪問過
- 2⃣️然後選取與v鄰接的沒有訪問過的任意一個頂點w,並訪問它
- 3⃣️再選取與w鄰接的沒訪問過的頂點訪問,重複上述動作,直到所有頂點被訪問過。
- PS:
- 需要一個visit[]數組,用來作爲頂點的訪問標記
- 需要一個visit[]數組,用來作爲頂點的訪問標記
- 基本思想:
- BFS圖的廣度優先搜索遍歷
- 基本思想:
- 1⃣️首先訪問起始頂點v
- 2⃣️然後選取與v鄰接的全部頂點w1 w2 ... wn 進行訪問
- 3⃣️再依次訪問與w1 w2 ... wn鄰接的全部頂點,重複動作,直到所有頂點被訪問過。
- PS:
- 需要一個隊列,用來存放頂點的全部未被訪問過的鄰接頂點p = p -> nextarc;(鄰接表)
- 隊列爲空的時候跳出循環
- 基本思想:
- DFS圖的深度優先搜索遍歷
-
最小代價生成樹(無向圖)
- 普里姆算法Prim
- 算法思想
- 1⃣️任意取出一個頂點,把它當成一棵樹,
- 2⃣️然後從與這棵樹鄰接的邊中挑一條最短的邊,並將這條邊所連接的頂點加入這棵樹
- 3⃣️然後再找一條與這棵樹鄰接的一條最短的邊,重複上述動作,直至所有頂點加入樹中
- 算法執行過程中的關鍵理解點
- 兩個數組,vset[]和lowcost[],vset[i]]=1表示頂點i已經加入樹中。lowcost[i]保存當前生成樹到頂點i的最短一條邊的權值
- 複雜度分析
- n^2
- 適用於稠密圖。無向圖。
- 算法思想
- 克魯斯卡爾Kruskal
- 算法思想
- 1⃣️用每次找出候選邊權值最小的邊,併入生成樹中
- 2⃣️重複上述動作,直至所有邊都檢測完畢。
- 算法執行過程中的關鍵理解點
- 圖中所有邊按照權值大小排序sort()
- 🌟從最小的邊開始掃描,檢測是否爲候選邊(該邊加入不會形成迴路),是,併入。
- 關於迴路問題【並查集】,一棵或者幾顆樹,找媽媽(root節點)媽媽一樣就是一家子(一個集合)。
- 複雜度分析
- 取決於排序算法的複雜度。規模由圖的邊數e決定
- 適用於稀疏圖。無向圖。
- 算法思想
- 普里姆算法Prim
-
最短路徑(有向圖)
- 迪傑斯特拉算法Dijkstra
- 求圖中某頂點到其餘頂點的最短路徑
- 算法思想
- 設兩個集合S,T。S存放已經找到的最短路徑的頂點,T存放剩餘頂點。
- 找v0到集合T中的所有頂點路徑最短的點Vu加入S中。
- 🌟每併入一個頂點,都要更新v0到T集合中剩餘頂點的最短路徑長度。
- 不斷重複上述動作,直至所有節點併入S中。
- 執行過程
- 引入3個數組,dist[],path[]和set[]數組。
- dist[]:當前已經找到的v0:奧vi的最短路徑的長度。初態:有邊就是邊的權值,無邊dist[vi] = ∞
- Path[]:保存從v0到vi最短路徑的前一個頂點。初態爲:v0到vi有邊,path[vi] = v0,否則path[vi] = -1 。本體就是-1。path保存的是一棵樹,一顆雙親存儲結構存儲的樹。藉助棧,可以直接輸出葉子到根路徑上的節點。
- Set[]:標記數組,set[vi] = 0 表示vi在T中,未併入S。初態:set[vo] = 1,其餘全爲0 。
- 複雜度
- n^2
- 弗洛伊德算法Floyd
- 求任意一對頂點間的最短路徑
- 算法思想
- 執行過程
- 複雜度
- n^3
mindmap
- 迪傑斯特拉算法Dijkstra
-