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; struct edge{ int u,v,w; bool operator<(const edge &t)const {return w<t.w;} }e[N]; int fa[N],ans,cnt; int find(int x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]); } bool kruskal(){ sort(e,e+m); for(int i=1;i<=n;i++) fa[i]=i; for(int i=0; i<m; i++){ int x=find(e[i].u); int y=find(e[i].v); if(x!=y){ fa[x]=y; ans+=e[i].w; cnt++; } } return cnt==n-1; } int main(){ cin>>n>>m; for(int i=0; i<m; i++) cin>>e[i].u>>e[i].v>>e[i].w; if(!kruskal()) puts("orz"); else printf("%d\n",ans); }
浙公网安备 33010602011771号