14 条题解
-
-2
使用 Kruskal 算法。
有环的情况可以用并查集跳过。
#include<bits/stdc++.h> using namespace std; long long n,m,fa[100005],cnt,ans,s[100005]; struct node{ long long u,v,w; }a[200005]; bool cmp(node x,node y){ return x.w<y.w; } int find(int x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]); } void merge(int x,int y){ if(s[x]<s[y]) swap(x,y); int fx=find(x),fy=find(y); fa[fy]=fx,s[fx]+=s[fy]; } int main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w); sort(a+1,a+m+1,cmp); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ if(find(a[i].u)==find(a[i].v)) continue; merge(a[i].u,a[i].v); cnt++; ans+=a[i].w; if(cnt==n-1) break; } printf("%lld",ans); return 0; }
信息
- ID
- 91
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 883
- 已通过
- 293
- 上传者