如何從乙個帶權圖中抽出一棵生成樹,使得邊權值和最小,這棵生成樹就叫做最小生成樹。常見的求解最小生成樹的演算法有 prim 演算法和 kruskal 演算法。
我們先來學習 prim 演算法。首先我們定義帶權圖 g的頂點集合為 v,接著我們再定義最小生成樹的頂點集合為 u,初始集合 u 為空。接著執行以下操作:
首先我們任選乙個頂點 x,加入集合 u,並記錄每個頂點到當前最小生成樹的最短距離。
選擇乙個距離當前最小生成樹最近的、且不屬於集合 u 的頂點 v(如果有多個頂點 v,任選其一即可),將頂點 v 加入集合 u,並更新所有與頂點 v 相連的頂點到當前最小生成樹的最短距離。
重複第二步操作,直至集合 u 等於集合 v。
最小生成樹構造完畢,集合 u 記錄了最小生成樹的所有邊。
分析演算法過程,我們可以發現,prim 演算法的思想類似貪心策略,每次都會選擇一條與當前最小生成樹相連且邊權值最小的點。prim 演算法的時間複雜度為 o(v^2)
),v 為圖 gg 頂點總個數,如果加上堆優化的話,可以把時間複雜度降到 o(vlogv+e),其中 e 為圖 g 的總邊數。prim 演算法一般應用於邊較為稠密的圖,也就是頂點較少、而邊較多的圖。
#include
#include
#include
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
struct edge ;
class graph
~graph()
void insert(int x, int y, int weight) );
edges[y].push_back(edge);
}int prim(int v)
};int main()
cout
<< g.prim(0) << endl;
return
0;}
最小生成樹 Prim
include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...
最小生成樹 prim
演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...
最小生成樹 PRIM
這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...