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;
}給出乙個無向圖,求出最小生成樹。不用判斷是否連通
#includeusingnamespace
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 輸出格式 輸出...