• HDOJ 1863 畅通工程


    MST,kruskal,并查集,路径压缩;

    参考白书的做法:另定义一个边序号数组,排序时按照边权的大小排;

    1A,表示已经对WA,TLE,RE等过敏,一提交心里就发毛啊……

    代码有点长,重新回到 CB 不太适应。

    # include <stdio.h>
    # include <stdlib.h>
    
    # define MAXN 105
    
    int n, m;
    int w[MAXN], u[MAXN], v[MAXN], r[MAXN], p[MAXN];
    
    int kruskal(void);
    int cmp(const void *x, const void *y){return (w[*(int*)x]<w[*(int*)y] ? -1:1);}
    int find(int x){return p[x]==x ? x:(p[x] = find(p[x]));}
    
    int main()
    {
        int i, ans;
    
        while (~scanf("%d%d", &n, &m))
        {
            if (!n) break;
            for (i = 1; i <= n; ++i)
            {
                r[i] = i;
                scanf("%d%d%d", &u[i], &v[i], &w[i]);
            }
            if (n < m-1) {puts("?"); continue;}
            for (i = 1; i <= m; ++i) p[i] = i;
            ans = kruskal();
            if (ans > 0) printf("%d\n", ans);
            else puts("?");
        }
    
        return 0;
    }
    
    int kruskal(void)
    {
        int i, cost, cnt, x, y, t;
    
        cnt = 0;
        cost = 0;
        qsort(r+1, n, sizeof(int), cmp);
        for (i = 1; i <= n; ++i)
        {
            t = r[i];
            x = find(u[t]);
            y = find(v[t]);
            if (x != y)
            {
                ++cnt;
                cost += w[t];
                p[x] = y;
            }
        }
    
        return cnt==m-1 ? cost:-1;
    }
  • 相关阅读:
    check_mysql.sh
    shell 数组长度
    Shell脚本中计算字符串长度的5种方法
    非缓冲文件编程(实时操作)
    ferror,clearerr和EOF含义
    密码库生成
    筛选出多个数据并判断
    扫描有分隔符的数据
    unicode文件处理(如果是ANSI编码就不需要了)
    ferror,perror,cleaner
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2464695.html
Copyright © 2020-2023  润新知