C++ 最小生成樹之Prim(普里姆)演算法
阿新 • • 發佈:2019-02-19
鄰接矩陣版:
const int INF = 1000000000; /*Prim演算法求無向圖的最小生成樹,返回最小生成樹的邊權之和*/ int Prim(int n, int s, vector<vector<int>> G, vector<bool>& vis, vector<int>& d) { /* param n: 頂點個數 s: 初始點 G: 圖的鄰接矩陣 vis: 標記頂點是否已被訪問 d: 儲存頂點與集合S的最短距離 return: 最小生成樹的邊權之和 */ fill(d.begin(), d.end(), INF); //初始化最短距離,全部為INF d[s] = 0; //初始點與集合S的距離為0 int sum = 0; //記錄最小生成樹的邊權之和 for (int i = 0; i < n; ++i) { int u = -1; //u使得d[u]最小 int MIN = INF; //記錄最小的d[u] for (int j = 0; j < n; ++j) //開始尋找最小的d[u] { if (vis[j] == false && d[j] < MIN) { MIN = d[j]; u = j; } } //找不到小於INF的d[u],則剩下的頂點與集合S不連通 if (u == -1) return -1; vis[u] = true; //標記u為已訪問 sum += d[u]; //將與集合S距離最小的邊加入到最小生成樹 for (int v = 0; v < n; ++v) { //v未訪問 && u能夠到達v && 以u為中介點可以使v離集合S更近 if (vis[v] == false && G[u][v] != INF && G[u][v] < d[v]) d[v] = G[u][v]; //更新d[v] } } return sum; //返回最小生成樹的邊權之和 }