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;

}

你可能感兴趣的:(OJ)