标签:并查集 合并 端点 const find == 函数 color 初始
伪代码
对所有边按权值从小到大排序,记录第i小的边为e[i],(1<=i<=m)
初始化MST为空
初始化连通分量,让每个点成为一个独立的连通分量
for(int i=0;i<m;i++){ if(e[i].u和e[i].v不在一个连通分量){ 把边e[i]加入MST 合并e[i].u和e[i].v所在的连通分量 } }
具体代码如下
const int maxn=1e5+5; int u[maxn],v[maxn],w[maxn],f[maxn],r[maxn]; int n,m;//节点数和边数 //边的端点和权值分别存在u,v,w中 int cmp(const int &i,const int &j) {return w[i]<w[j];} //间接排序函数 int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}//并查集 int Krusal(){ int ans=0; for(int i=0;i<n;i++) f[i]=i;//初始化并查集 for(int i=0;i<m;i++) r[i]=i; sort(r,r+m,cmp); for(int i=0;i<m;i++){ int e=r[i]; int x=find(u[e]),y=find(v[e]); if(x!=y) { ans+=w[e]; f[x]=y; } } }
标签:并查集 合并 端点 const find == 函数 color 初始
原文地址:https://www.cnblogs.com/033000-/p/10035407.html