基本演算法:首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。選擇一條權值最小,
且一端點a已加入生成樹,另一端點b在剩餘結點集內的邊作為最小生成樹上的邊,同時將b列入生成樹的已有點集中。當所有結點都加入到最小生成樹中之後,
就找出了連通圖中的最小生成樹。
prim演算法複雜度是o(n^2),適合稠密圖。
/*primq求mst
耗費矩陣cost,標號從0開始,0~n-1
返回最小生成樹的權值,返回-1表示原圖不連通
*/#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int maxn=505;
int cost[maxn][maxn];
bool vis[maxn];
int lowc[maxn];
int prim(int cost[maxn],int n)//點是0~n-1
}if(minc==inf)
return -1;//原圖不連通
ans+=minc;
vis[p]=true;
for(int j=0;jcost[p][j])
lowc[j]=cost[p][j];}}
return ans;
}int main()
}int res=prim(cost,n);
cout<
最小生成樹prim演算法模板
include using namespace std const int inf 0x3f3f3f3f 最大值,方便計算 int n,m n是點的個數,m是邊的數量 int dis 105 vis 105 dis是判斷未加入生成樹的頂點到已知生成樹的最短距離,vis判斷是否已經加入生成樹 int ...
模板) 最小生成樹Prim演算法
演算法跟dijkstra很像 但是要特別注意兩點 1.最好使用乙個額外的陣列來保證每個點只被訪問一次,否則的話應該保證在35行處使用e.dis dis e.num 而不僅是 否則會造成一些相等的額外相加。2.40行的地方要注意與dijkstra的區別!不是加而是直接換!include include...
最小生成樹prim演算法(模板)
prim演算法適合稠密圖,即邊數較多而點較少的情況,時間複雜度為o n2 o n 2 堆優化的情況下,如果點數為m,邊數為n,可以達到o nlog m o n logm 思想很簡單,就是每次尋找一條由已加入集合的點和與它們相鄰的沒加入集合的點的權值最小邊,進行n 1次就找出來了,也是貪心的思想,實現...