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;
}
}