HDOJ 1879 继续畅通工程

依然是:MST, kruskal,并查集,路径压缩;

在LD下的CB中老是提示segmentation fault,不知什么错误,回到win运行一闪而过而没有输出,查了半天发现查函数有一处错误,继续,仍然无输出,怀疑变量命名错误,更改,仍然无输出,最后发现文件保存的路径和输入文件的路径不一致,怎么样,流水账记得不错吧?

500MS,看了排行榜上没有0MS的,明白这道题500MS不算浪费时间。

# include <stdio.h>
# include <stdlib.h>

typedef struct {
    int u, v;
    int w;
}Road;

int m, n, p[105];
Road r[5005];

int kruskal(int n);
int cmp(const void*x, const void*y){ return (*(Road*)x).w>(*(Road*)y).w ? 1:-1;}
int find(int x){ return x==p[x] ? x:(p[x]=find(p[x]));} /*错误:p[x]=find(x); */

int main()
{
    int i, j, x, y;
    int tu, tv, tw, tf;

    while (1)
    {
        scanf("%d", &m);
        if (!m) break;
        
        n = m*(m-1)/2;
        
        for (i = 1; i <= m; ++i) p[i] = i;
        for (j = 0, i = 1; i <= n; ++i)
        {
            scanf("%d%d%d%d", &tu, &tv, &tw, &tf);
            if (!tf)   /*只记录没有在修的路*/
            {
                ++j;
                r[j].u = tu,
                r[j].v = tv;
                r[j].w = tw;
            }
            else    
            {
                x = find(tu);
                y = find(tv);
                if (x != y) p[x] = y;
            }
        }
        printf("%d\n", kruskal(j));
    }

    return 0;
}

int kruskal(int n)
{
    int i, cost, x, y;

    qsort(r+1, n, sizeof(r[0]), cmp);

    cost = 0;
    for (i = 1; i <= n; ++i)
    {
        x = find(r[i].u);
        y = find(r[i].v);
        if (x != y)
        {
            cost += r[i].w;
            p[x] = y;
        }
    }

    return cost;
}
原文地址:https://www.cnblogs.com/JMDWQ/p/2464865.html