最下生成树kruskal
- 把图中的所有边按代价从小到大排序;
- 把图中的n个顶点看成独立的n棵树组成的森林;
- 按权值从小到大选择边,所选的边连接的两个顶点ui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
- 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。
int n,fa[];
int m;
int ans;
struct node
{
int w;
int x,y;
}e[];
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
for(int i=1;i<=n;i++) //最开始每个点都是一个树
fa[i]=i;
for(int i=1;i<=n;i++)
{
/*...*/
}
int k=0;
sort(e+1,e+1+n,cmp); //将边升序排序
for(int i=1;i<=m;i++)
{
int x=e[i].x,y=e[i].y;
x=find(x),y=find(y);
if(x!=y) //判断是否在同一个集合
{
fa[x]=y;
k++;
ans+=e[i].w;
if(k==n-1)
{
/**/
return 0;
}
}
}
return 0;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18681992

浙公网安备 33010602011771号