今天覆習的時候,剛好複習的這一塊,所以就簡單做乙個備忘,寫的潦草還望大家不要介意呀~】
1、dijistra演算法
思路:根據點集合將其分為兩個集合,一種是已經訪問過的點s集合(代表從源點到該集合中的點的距離最小),另一種是未訪問過的u集合,然後每次從u集合中選擇節點,使得源點到改點的距離最小,並新增進s集合,然後更新距離,迭代直至所有節點都已經加入s集合中,此時可以求得的list集合是源點到所有點的最短距離,如果要求最短路徑的話,可以加上乙個prev集合,用於儲存前面的節點。
#include #include #include #include #include using namespace std;
void dijistra(int v0, int n)
visited[v0] = true;
for (int i = 2; i < n; i++)
} visited[u] = true;
for (int j = 1; j < n; j++)
} }}
2、bfs遍歷演算法
思路:可以求得源點到所有點的最短距離,但是路徑暫時沒考慮。
1、普利姆演算法(根據點構建)
有些類似於dijstra演算法,將節點分為兩個結合,訪問過的s和未曾訪問過的集合u,每次從u中計算距離s中距離最短的節點,加入s中,迭代直至s為全集。
2、克魯斯卡爾演算法(根據邊構建)
將邊權重按照從小到大排序,每次選出最小邊,但需要判斷該邊的點是否在一棵子樹中,如果不是則加入,是則跳過,直至所有點訪問完畢。
參考:
最短路徑 最小生成樹
題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...
最短路徑,最短路徑樹和最小生成樹
首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用dijkstra演算法,floyd演算法求解。最短路徑樹spt sho...
最小生成樹和最短路徑
這篇算作是 演算法 第四版部分讀後感吧 我思考這個問題的開始就是糾結最小生成樹prim演算法和最短路徑dijkstra演算法的異同 1.最小生成樹prim演算法 直接從例子開始吧,我們考慮一副這樣的圖 1.將d設為起始點 設定某個點為起始點是隨機的 考慮與它相鄰節點的權重值,圖中黃色節點,也就是d ...