• POJ3723 Conscription


    http://poj.org/problem?id=3723

          这题虽然简单,但是还是错了很多次。

     因为这题构建的图可能是不连通的。也就是说可能有很多棵树。

    所以我以前写的并查集用在这上面会出问题的。

    while(x != f[x])

        x = f[x];

    return f[x];

    //我这样子每次用完之后并没有更新f[x]的值。

    //虽然在连通图中没问题,但是在不连通的图里用就会有问题啦。大哭 血的教训。。。。

    改正:

    if(x !=f[x]) 

       f[x] = find(f[x]);

    return f[x];

    //============================================

    code:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 20050;
    const int maxm = 50050;
    struct edge {
        int x, y, w;
        bool operator < (const edge& rhs) const {
            return w > rhs.w;
        }
    };
    
    edge es[maxm];
    int f[maxn];
    int n, m;
    
    int Find(int x)
    {
        if(x !=f[x])
            f[x] = Find(f[x]);
        return f[x];
    }
    
    int  kruskal() {
        int i, a, b;
        int ans = 10000*n;
        for(i=0; i<=n; ++i) f[i] = i;
        sort(es, es+m);
        for(i=0; i<m; ++i) {
            a = Find(es[i].x);
            b = Find(es[i].y);
            if(a!=b) {
                f[a] = b;
                ans -= es[i].w;
            }
        }
        return ans;
    }
    int main() {
        int N, M, R, i, t;
        scanf("%d",&t);
        while(t--) {
            scanf("%d%d%d",&N,&M,&R);
            n = N+M;
            m = R;
            for(i=0; i<m; ++i) {
                scanf("%d%d%d",&es[i].x, &es[i].y, &es[i].w);
                es[i].y  += N;
            }
            printf("%d
    ", kruskal());
        }
        return 0;
    }
    



  • 相关阅读:
    Java基本语法--程序流程控制
    Java基本语法--控制台输入(Scanner类)
    Java基本语法--运算符
    curl:出现SSL错误提示
    升级ruby的版本
    Linux之expect非交互式功能
    Rsync备份同步数据工具
    Linux发展历史
    解决DDOS攻击生产案例
    用shell脚本监控MySQL主从同步
  • 原文地址:https://www.cnblogs.com/pangblog/p/3359909.html
Copyright © 2020-2023  润新知