最下生成树kruskal

  1. 把图中的所有边按代价从小到大排序;
  2. 把图中的n个顶点看成独立的n棵树组成的森林;
  3. 按权值从小到大选择边,所选的边连接的两个顶点ui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
  4. 重复(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;
}
posted @ 2025-01-20 17:11  流氓兔LMT  阅读(16)  评论(0)    收藏  举报