最小生成树模板(kruskal算法)

    技术2023-07-07  86

    题目链接:https://www.luogu.com.cn/problem/P3366

    tip:作为队伍的数据结构选手,来记录一下模板题供以后比赛前复习~~~(其实是队友太懒了)

    题解:这边用了kruskal算法,首先将边权从小到大排序后,再遍历每一条边,用并查集检查当前遍历到的边的两端节点是否已经连通,若不连通则加入到集合中,最后判断一下边是否是节点的数量-1即可。

    代码:

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+10; typedef struct{ int x,y,z; }node; node e[maxn]; int n,m,f[maxn]; bool cmp(node a,node b){ return a.z<b.z; } void init(){ for(int i=0;i<=n;i++) f[i]=i; } int find(int x){ while(x!=f[x]) x=f[x]; return x; } int main() { cin>>n>>m; init(); int x,y,z; for(int i=0;i<m;i++){ cin>>x>>y>>z; e[i].x=x;e[i].y=y;e[i].z=z; } sort(e,e+m,cmp);ll ans=0;int bian=0; for(int i=0;i<m;i++){ x=find(e[i].x);y=find(e[i].y); if(x==y) continue; if(x>y) swap(x,y); f[y]=x;ans+=e[i].z;bian++; } if(bian==n-1) cout<<ans; else cout<<"orz"; return 0; }

     

    Processed: 0.008, SQL: 9