int fa[N]; intfind(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}
structedge { int u,v,w; friendinlinebooloperator < (const edge & a,const edge & b) { return a.w < b.w; } }Edge[M];
intKruskal(){ std::sort(Edge+1,Edge+1+m); int ans = 0; for (int i = 1;i <= m;++i) { edge e = Edge[i]; int fu = find(e.u),fv = find(e.v); if (fu != fv) { ans += e.w; fa[fu] = fv; } } return ans; }
Prim
从一个点开始建树,每次把连接树外和树内最小的边加入树。
如果在稀疏图中可以采用堆优化,代码类似 Dijkstra。
时间复杂度 $O(n^2 + m)$ 常用于稠密图,优化后为 $O((n + m) \log n)$