1. 程式人生 > 其它 >prime演算法-構造最小生成樹

prime演算法-構造最小生成樹

技術標籤:演算法

1.演算法原理

將所有節點分成兩個集合V,U。
在帶權連通圖中V是包含所有頂點的集合,U是已經在最小生成樹中的節點;

(1)初始時,從圖中任意某一頂點v開始,此時集合U={v}(以v到其他頂點的所有邊為侯選邊);
(2) 在所有u∈U,w∈V-U的邊(u,w)∈E中找到一條權值最小的邊,將(u,w)這條邊加入到已找到邊的集合,並且將點w加入到集合U中,
(3)重複上一操作,當U=V時,就找到了這顆最小生成樹

總而言之,每次查詢U中的點與V-U中點路徑權值最小的邊,再將這條邊連線的V-U中的點加入到最小生成樹,一直迴圈,直到所有的點被加入到最小生成樹中,所生成的集合U就是最小生成樹。

實現

設立兩個資料結構

vector<bool>visited; 表示該點是否被加入到最小生成樹中,如果在值為1,不在值為0
vector<int>min_cost; 未在最小生成樹中的點到最小生成樹中的節點的最小權值
class Solution {
public:
    int minCostConnectPoints(vector<vector<int>>& points) {
        int n=points.size();
        int count=points.size();
        int result=
0; vector<bool>visited(n,0); vector<int>min_cost(n,0); //先把0加入 visited[0]=1; min_cost[0]=-1;//為-1的時候表示節點已經加入 count-=1; for(int i=1;i<n;i++){ min_cost[i]=abs(points[i][0]-points[0][0])+abs(points[i][1]-points[0][1]); } while
(count>0){ int min=INT_MAX; int index=-1; //找到最小值min_cost並記錄下標 for(int i=1;i<n;i++){ if(visited[i]==0&&min_cost[i]<min){ index=i; min=min_cost[i]; } } result+=min; //將min加入 visited[index]=1; //更新min_cost for(int i=0;i<n;i++){ //每次查詢權值最小的邊U->U-V if(visited[i]==0&&(abs(points[i][0]-points[index][0])+abs(points[i][1]-points[index][1]))<min_cost[i]){ min_cost[i]=(abs(points[i][0]-points[index][0])+abs(points[i][1]-points[index][1])); } } count--; } return result; } };