zoukankan      html  css  js  c++  java
  • luogu P3366 【模板】最小生成树 | kruskal

    luogu P3366 【模板】最小生成树

    在连接各个点的所有路径中,选取最短的路径连接所有点

    n个顶点,e条边,时间复杂度O(eloge)

    kruskal主要思路:

    1. 输入边,用结构体储存

    2. 用结构体快排以边比较从小到大快排

    3. 建一个并查集,并初始化并查集(并查集代表两个点有没有在同一个树里面

    4. for(i=1;i<=m(边数);i++)找最短的一条边,若其连接的两个点不在同一个并查集里面,就将两者所在的并查集合并,并将ans+=s[i].len。

    5. 若在同一个并查集,则跳过这次循环。因为如果这两个点连接起来,就会形成一个环。

    6. 直到边有n-1条
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct ll
    {
        int x,y,len;
    }s[200020];
    bool cmp(ll a,ll b)
    {
        return a.len<b.len;
    }
    int n,m,ans;
    int fa[5050],big[5050];
    int getfa(int x)
    {
        if(fa[x]==x) return x;
        return fa[x]=getfa(fa[x]);
    }
    void gaibaba(int x,int y)
    {
        int ba1=getfa(x),ba2=getfa(y);
        if(ba1==ba2) return;
        if(big[ba1]<big[ba2])
        {
            fa[ba1]=ba2;
            big[ba2]+=big[ba1];
        }
        else
        {
            fa[ba2]=ba1;
            big[ba1]+=big[ba2];
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].len);
            fa[s[i].x]=s[i].x;
            fa[s[i].y]=s[i].y;
        }
        int k=0;
        sort(s+1,s+m+1,cmp);
        for(int i=1;i<=m;i++)
        {
            if(getfa(s[i].x)!=getfa(s[i].y))
            {
                ans+=s[i].len;
                gaibaba(s[i].x,s[i].y );
                k++;
            }
            if(k==n-1)
            {
                printf("%d",ans);
                return 0;
            }
        }
        printf("orz");
        return 0;
    }
  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/QAQq/p/10301106.html
Copyright © 2011-2022 走看看