14 条题解
-
1
在这里,我使用了 Kruskal 算法解决这道题(想看Prim算法的移步别的题解)。
思路:把边从边权大小从小到大排序,从 号开始遍历整个图,创建最小生成树,累加权值。使用一个优化后的并查集,如果所有边都在一个集中,则结束。输出权值总和。如果枚举完所有的点后仍达不到 条,则不行。
最后,我想提醒大家:
不开longlong,见!祖!宗!
代码(禁止抄袭!):
#include<bits/stdc++.h> using namespace std; int n,m,sum,cnt,f[200001]; struct node{ int u,v,w; }a[200001]; bool cmp(node x,node y){ return x.w<y.w; } int find(int x){ if(f[x]==x){ return x; } return f[x]=find(f[x]); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ f[i]=i; } for(int i=1;i<=m;i++){ scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); } sort(a+1,a+m+1,cmp); for(int i=1;i<=m;i++){ if(find(a[i].u)!=find(a[i].v)){ cnt++; sum+=a[i].w; f[find(a[i].u)]=find(a[i].v); } } if(cnt!=n-1){ printf("orz"); return 0; } printf("%d",sum); return 0; }
信息
- ID
- 91
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 883
- 已通过
- 293
- 上传者