最小生成樹模板

2022-05-27 11:57:15 字數 893 閱讀 2886

本質是維護乙個集合,選擇乙個點作為初始點a先加入集合,遍歷未加入集合的點,將它們到a的距離設為到集合的最短距離,選則其中的最小值,將該點再加入集合。每次有新的點加入集合後,都用該點更新其餘未加入集合的點到集合的距離。(與dijkstra不同的是,prim每次選擇到集合最近的點,而dijkstra選擇到源點最近的點)。

複雜度\(o(n^2)\),適用於稠密圖

#include using namespace std;

const int inf=1e9;

const int maxn=2e3+5;

int cost[maxn][maxn];

int lowcost[maxn],vis[maxn];

int prim(int n)

}return ans;

}int main()

}int ans=prim(n);

printf("%d\n",ans);

}

建立邊結構體,將邊按照權值排序,從小到大加入樹中,若一條邊的兩個點已經在同一棵樹中(用並查集維護),則跳過這條邊。

複雜度\(o(e*loge)\)

#include using namespace std;

const int maxn=1e3+5;

const int maxm=2e5+5;

struct edgee[maxm];

int tot=0;

void addedge(int u,int v,int w)

bool cmp(edge a,edge b)

int ans=kruskal(n);

printf("%d %d\n",n-1,ans);//邊數,樹上最大邊

}

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...