prime演算法-構造最小生成樹
阿新 • • 發佈:2021-01-21
技術標籤:演算法
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;
}
};