int p[3005],w[3005],r[3005],u[3005],v[3005];//并查集 权重 边序号 边的一点 边的一点
int n,m;//顶点数,边数
int cmp(const int i,const int j)
{
return w[i]<w[j];
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int kruskal()
{
int ans=0;
for(int i=0; i<n; i++)
{
p[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]);
int y=find(v[e]);
if(x!=y)//注意此处x和y是查找后返回的根节点,不是边的起点和终点
{
ans+=w[e];
p[x]=y;
}
}
return ans;
}
最小生成树(MST) Kruskal模板
于 2019-09-27 10:22:27 首次发布