模板 最小生成樹

2022-09-18 02:30:22 字數 1447 閱讀 5799

prim:

給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出impossible。

#include

using namespace std;

const int maxm = 200005;

const int inf = 0x3f3f3f3f;

struct edgee[maxm << 1];

int cnt, n, m, sum, t, p, now = 1;

int dis[5005], head[maxm], vis[5005];

int a, b, c;

void add(int uu, int vv, int ww)

int main()

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

dis[i] = inf;

for(int i = head[1]; i; i = e[i].next) // 判斷重邊

dis[e[i].v] = min(e[i].w, dis[e[i].v]);

while(++t < n)

}if(now == -1) // 若有乙個點更新完後dis陣列仍為 inf,那麼不能構成最小生成樹

sum += minn;

for(int i = head[now]; i; i = e[i].next) //更新dis陣列

}cout << sum;

return 0;

}給出乙個無向圖,求出最小生成樹。不用判斷是否連通

#includeusing

namespace

std;

const

int maxm = 200005

;const

int inf = 0x3f3f3f3f

;struct

edgee[maxm

<< 1

];int cnt, n, m, sum, t, p, now = 1

;int dis[5005], head[maxm], vis[5005

];int

a, b, c;

void add(int uu, int vv, int

ww)int

main()

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

dis[i] =inf;

for(int i = head[1]; i; i =e[i].next)

dis[e[i].v] =min(e[i].w, dis[e[i].v]);

while(++t }

if(dis[now] ==inf)

sum +=minn;

for(int i = head[now]; i; i =e[i].next)

}cout

}

兩者差別在於每次迴圈邊時對now的處理

最小生成樹模板

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 輸出格式 輸出...