考研天勤 数据结构 图(自用回顾)
考研天勤 數據結構 圖的算法
- 兩種特殊的存儲結構十字表與鄰接多重表
- 十字表(有向圖)
- 鄰接多重表(無向圖)
- 生成樹算法
- Prim算法(選點)
- Kruskal算法(選邊)
- 最短路徑
- 迪杰斯特拉算法(單源)O(n2)
- Floy算法(多源最短路徑)O(n^3)
- 遍歷
- DFS
- BFS
- 拓撲排序
- 普通拓撲
- 逆拓撲
- 拓撲排序的應用 關鍵路徑
- 圖的判環
- 判斷連通分量(圖的連通性)
兩種特殊的存儲結構十字表與鄰接多重表
頂點存數據和第一個邊的指針,邊存練連的頂點和兩個端點的兄弟邊(即下一條邊)
十字表(有向圖)
節點和邊分開存
頂點:數據 第一個入邊指針 第一個出邊指針
邊:尾點 頭點 同頭兄弟邊指針 同尾兄弟邊指針 邊的信息
鄰接多重表(無向圖)
節點和邊分開存
節點:數據 第一個邊
邊:Mark標記 i節點 i連的邊 j節點 j連的邊 邊的信息
生成樹算法
Prim算法(選點)
初始化:vis數組與dist數組,初始化的時候已經放入了第一個點,所以第一層循環是進行n-1次循環,如果發現選出的點的距離是無窮大則說明此連通分量已經找完,跳出算法(本代碼沒有實現)
Kruskal算法(選邊)
每次從圖中選出一個最小的邊放進生成樹中,加入時不能讓生成樹成為環,用并查集的方式,如果要加入的邊的兩個頂點有共同的祖先,則不加入此邊,若邊符合條件,則加入后應進行并查集合并,合并公共祖先。
初始化:因為每個邊的長度不會再改變,所以初始化時進行一次邊排序就行了。初始化并查集數組,每個節點祖先設為自己。
有并查集判環,就沒用vis數組記錄是否訪問過,因為對象是邊
最短路徑
迪杰斯特拉算法(單源)O(n2)
從圖中每次選一個離最初節點最近的頂點(和Prim算法的區別),然后加入點后,看這個點有沒有影響剩下的點到源點的距離并更新(Prim是觀察的這個新加入的頂點和剩下的點,不是到源點)
注意:記錄路徑是在選完新加入的節點后,更新了剩下的節點的dist后再記錄。
初始化:dist數組為到源點的邊的長度,vis數組,dist數組中源點設為1,path數組與源點相連的頂點記錄path為源點
Floy算法(多源最短路徑)O(n^3)
把每個節點作為中間節點,然后對i和j這一懟頂點進行更新,看它的引入能否使i和j距離更短。如果更短,就把中間點設為path[i][j]。
遞歸追蹤path,-1說明這兩點之間沒有中間點了,就是最短路徑
初始化:path全為-1,鄰接矩陣
遍歷
DFS
遞歸是對此頂點的每個孩子進行dfs
BFS
拓撲排序
普通拓撲
選取沒有
用一個數組記錄每個頂點的入度,選取入度為0的節點,然后更新與這個頂點相鄰的頂點的度。拓撲排序用棧實現,把選的點放進棧里。while(不空)
逆拓撲
使用DFS遞歸即可,把print放在最后,因為使用DFS遍歷的最后一個一定是沒有子節點的,所以逆拓撲
拓撲排序的應用 關鍵路徑
關鍵路徑是彈性時間為0的活動組成的路徑
圖的判環
①拓撲排序判環:如果最后輸出的節點數小于總節點數,則說明有環。
判斷連通分量(圖的連通性)
無向圖用一次dfs或者bfs,有向圖用兩次,一次正向,第二次逆置邊后在dfs/bfs。
(圖片來自天勤數據結構)
總結
以上是生活随笔為你收集整理的考研天勤 数据结构 图(自用回顾)的全部內容,希望文章能夠幫你解決所遇到的問題。