D08 最小生成树 Kruskal 算法
视频链接:https://www.bilibili.com/video/BV1yt4y1H7F9/
// Luogu P3366 【模板】最小生成树 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=200006; 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); return 0; }