A - 畅通工程

 

思路:

  • 用结构体捆绑两个村庄和其间的距离
  • 使用并查集和最小生成树,此处采用kruskal算法求最小生成树.  

代码:

#include <stdio.h>

int fa[10000];

void init(int m)
{
   for (int i = 1; i <= m; i++ )
        fa[i] = i;
}

int find(int x)
{
    if (x != fa[x])
        return fa[x] = find(fa[x]);

    return x;
}

void add(int x, int y)
{
    x = find(x);
    y = find(y);

    if (x != y)
    {
       fa[x] = y;
    }
}

void count(int m)
{
    int i, cnt = -1;
    for ( i = 1; i <= m; i++)
    {
        if (fa[i] == i)
            cnt++;
    }

    printf ("%d\n", cnt);
}

int main()
{
    int m, n, i;

    while (scanf("%d %d", &m, &n) != EOF && m)
    {
        init(m);

        int x, y;
        for (i = 1; i <= n; i++)
        {
            scanf ("%d %d", &x, &y);
            add(x, y);
        }

        count(m);
    }

}

 错误原因:

未能理解下列代码

int find(int x)
{
    if (x != fa[x])
        return fa[x] = find(fa[x]);

    return x;
}

void add(int x, int y)
{
    x = find(x);
    y = find(y);

    if (x != y)
    {
       fa[x] = y;
    }
}

 

 
posted @ 2019-07-09 16:25  question-maker  阅读(264)  评论(0编辑  收藏  举报