算法第四版- 4.3
生活随笔
收集整理的這篇文章主要介紹了
算法第四版- 4.3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法第四版- 4.3
最小生成樹MST
文章目錄
- **算法第四版- 4.3**
- 0.序
- 1.Prim算法
- 2. Kruskal算法
0.序
Prim算法,以頂點為單元,與圖中邊數無關,比較適合于稠密圖
Kruskal算法,以邊為頂點,時間主要取決于邊數,適合稀疏圖
下面代碼的來源
采用的是曼哈頓距離。
1.Prim算法
class Solution { public:int prim(vector<vector<int> >& points, int start) {int n = points.size();int res = 0;// 1. 將points轉化成鄰接矩陣, 這一步可有可無vector<vector<int> > g(n, vector<int>(n));for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {int dist = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1]);g[i][j] = dist;g[j][i] = dist;}}// 記錄V[i]到Vnew的最近距離vector<int> lowcost(n, INT_MAX);// 記錄V[i]是否加入到了Vnewvector<int> v(n, -1);// 2. 先將start加入到Vnewv[start] = 0;for (int i = 0; i < n; i++) {if (i == start) continue;lowcost[i] = g[i][start];}// 3. 剩余n - 1個節點未加入到Vnew,遍歷for (int i = 1; i < n; i++) {// 找出此時V中,離Vnew最近的點int minIdx = -1;int minVal = INT_MAX;for (int j = 0; j < n; j++) {if (v[j] == 0) continue;if (lowcost[j] < minVal) {minIdx = j;minVal = lowcost[j];}}// 將該點加入Vnew,更新lowcost和vres += minVal;v[minIdx] = 0;lowcost[minIdx] = -1;// 更新集合V中所有點的lowcostfor (int j = 0; j < n; j++) {if (v[j] == -1 && g[j][minIdx] < lowcost[j]) {lowcost[j] = g[j][minIdx];}}}return res;}int minCostConnectPoints(vector<vector<int>>& points) {return prim(points,0);} };樓上是O(n^2)
再補充一個堆優化的,O(mlogn),m為邊的數目
2. Kruskal算法
依次選擇最小的邊,看是否形成環
時間復雜度O(m log(m) + m α(m) )
總結
以上是生活随笔為你收集整理的算法第四版- 4.3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tail的使用
- 下一篇: 判断一个链表是否为循环单链表