1. 程式人生 > 實用技巧 >最小生成樹 普里姆(prim)演算法

最小生成樹 普里姆(prim)演算法

prim的基本思想是對圖G(V,E)設定集合S來存放已經被訪問的頂點

  1. 每次從集合V-S(未加入最小生成樹的節點)中選擇與集合S最近點頂點u(用d[u]記錄u與S的最短距離),將u加入集合S,同時將這個節點與集合S最近的邊加入最小生成樹
  2. 以頂點u作為集合S與V-S的介面,優化從u出發能達到的且還未訪問的頂點v與集合S的最短距離即max(d[v],G[u][v]);

具體實現

int prim() {
    fill(d, d + maxn, INF);  //最開始所有點離集合S的距離為INF
    d[0] = 0;                //起點可以任意選擇,這裡以0為起點
    int
ans = 0; //記錄最小生成樹的總權重 for (int i = 0; i < n; ++i) { int u = -1, MIN = INF; for (int j = 0; j < n; ++j) { if (vis[j] == false && d[j] < MIN) { u = j; MIN = d[j]; } } if (u == -1) return
; vis[u] = true; //將u併入集合S ans += d[u]; //增加權重 for (int v = 0; v < n; ++v) { //從u出發能到達的且未訪問的節點v的距離G[u][v]比當前的d[v]短 if (vis[v] == false && G[u][v] != INF && G[u][v] < d[v]) { d[v] = G[u][v]; //優化距離 } } }
return ans;//返回最小生成樹的總權重 }