D08【模板】最小生成树 Kruskal 算法
D08 最小生成树 Kruskal 算法_哔哩哔哩_bilibili
1. 边集 {u,v,w} 排序
2. 并查集维护最优选边
// Kruskal算法 O(mlogm) #include<bits/stdc++.h> using namespace std; const int N=200010; int n,m; int fa[N],ans,tot; pair<int,pair<int,int> >e[N]; //边集 int find(int u){ return fa[u]==u?u:fa[u]=find(fa[u]); } void kruskal(){ sort(e+1,e+1+m); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int x=find(e[i].second.first),y=find(e[i].second.second); if(x!=y){ fa[x]=y; ans+=e[i].first; if(++tot==n-1) break; } } if(tot==n-1) printf("%d\n",ans); else puts("orz"); } int main(){ cin>>n>>m; for(int i=1,u,v,w;i<=m;i++){ cin>>u>>v>>w; e[i]={w,{u,v}}; } kruskal(); }
浙公网安备 33010602011771号