最小生成樹模板(Kruskal演算法和prim演算法)

2021-10-05 05:48:41 字數 1358 閱讀 3508

kruskal演算法將乙個連通塊當做乙個集合,先對所有邊進行一次排序,然後按順序列舉每一條邊,當此條邊的兩個點滿足不屬於同乙個集合的時候,如果這條邊連線的兩個點屬於同一集合,就跳過。直到選取了n-1條邊為止。

這裡實用並查集對集合進行維護。

#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

#define llinf 0x3f3f3f3f3f3f3f3f

using namespace std;

const int maxn = 200005;

int n,m;

int f[maxn];

//vectorg[maxn];

struct edgea[maxn];

int find(int x)

bool cmp(edge d,edge e)

int cnt=0;

sort(a+1,a+1+m,cmp);

int fx,fy;

for(int i=1;i<=m;i++)

if(cnt==n-1)break;

} cout《和kruskal演算法相似的貪心思想,不同的是,prim演算法適合於稠密圖

不同於kruskal演算法的每次向集合中加入邊,prim演算法每次向集合中加入邊,所以引用vis判斷是否已進入集合,dis[u]表示不在集合的點u到集合中的最短長度

#include#include#include#include#include#include#include#include#include#define ll long long

#define inf 0x3f3f3f3f

#define llinf 0x3f3f3f3f3f3f3f3f

#define maxm 200005

#define maxn 5005

using namespace std;

struct edgee[maxm<<1];

int head[maxn],dis[maxn],cnt,n,m,tot,now=1,ans;

bool vis[maxn];

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

inline void init()

} typedef pair pii;

priority_queue ,greater> q;

ll sum=0;

inline void prim()

} } }

int main()//prim演算法

模板 最小生成樹 Kruskal

兩種寫法 第一種 使用陣列 時間複雜度 o nlogn includeusing namespace std define max 200000 10 int n,m n 結點的數量 m 邊的數量 int u max v max w max r max p max u i v i 第i條邊的兩端點,...

模板 最小生成樹Kruskal

基本介紹 模板題目 實現 最小生成樹問題一般有兩種解法 prim和kruskal 因為之前學過並查集所以果斷選擇先學後者 kruskal是一種利用並查集來求解最小生成樹的演算法 它將每乙個聯通塊當作乙個集合 先將邊按從小到大的順序排序 現在每乙個點都是孤立的 並且自己成為乙個集合 然後按排好的順序列...

最小生成樹(模板 Kruskal)

description 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省 暢通工程 的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有直接的公路相連,只要能間接通過公路可達即可 並要求鋪設的公路總長度為最小。請計算最小的公路總長度。input 測試輸入包含若干測試用例。每個測...