HDOJ1232

HDOJ1232

不瞒大家,这题提交了十几遍,一道简单的并查集,硬是被我做成了一坨屎,orz,还是自己没有真正理解并查集的意思,导致自己翻车了2333

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
int city[1002];
int find(int x)
{
int temp=x;
while(city[temp] != temp) //一定是while不能是if,是寻找根节点,不是父节点
temp = city[temp];
return temp;
}
void merge(int a, int b)
{
int fa, fb;
fa = find(a);
fb = find(b);
if (fa != fb)
city[fa] =fb;
}
int main()
{
int cnum, rnum, count,x, y,i;
while (scanf("%d", &cnum),cnum)
{
for (i = 1; i <=cnum; i++)
city[i] = i;
for(scanf("%d",&rnum);rnum>0;rnum--)
{
scanf("%d %d", &x, &y);
merge(x, y);
}
for (i= 1,count=-1; i <= cnum; i++)
if (city[i] == i)
count++;
printf("%d\n", count);
}
}