标签:void turn cst ++ nbsp opera clu amp 顶点
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
输出最小生成树的所有边的权值之和。
9 14 1 2 4 2 3 8 3 4 7 4 5 9 5 6 10 6 7 2 7 8 1 8 9 7 2 8 11 3 9 2 7 9 6 3 6 4 4 6 14 1 8 8
37
排序,并查集。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define MAX 50000 using namespace std; struct edge { int u,v,w; }e[MAX + 5]; struct cmp { bool operator ()(const edge &a,const edge &b) const { return a.w < b.w; } }; int f[MAX]; void init(int n) { for(int i = 1;i <= n;i ++) { f[i] = i; } } int getf(int x) { if(f[x] != x) f[x] = getf(f[x]); return f[x]; } int Merge(int x,int y) { int xx = getf(x),yy = getf(y); if(xx == yy) return 0; f[xx] = yy; return 1; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i = 0;i < m;i ++) { scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); } sort(e,e + m,cmp()); init(n); int ans = 0; for(int i = 0;i < m;i ++) { if(Merge(e[i].u,e[i].v)) { ans += e[i].w; } } printf("%d",ans); }
标签:void turn cst ++ nbsp opera clu amp 顶点
原文地址:https://www.cnblogs.com/8023spz/p/9949257.html