并查集----(1)
题目描述
众所周知,英语四六级考试有几套不同的试卷,而且,为了防止我们抄袭旁边同学的,一般附近同学的试卷和你的试卷不一样。但是,我们还是知道了一些同学的试卷是相同的,假设有n个同学,编号为0~n-1,你的编号为0,,根据我们已知的信息,求还有多少人的试卷和你的试卷是相同的。
输入
多组输入,每组第一行,有两个整数n,m(2 <= n <= 100000, 0 <= m <= 10000),代表n个同学,m条我们已知的信息。
接下来m行,每行有两个整数a,b(0 <= a,b <= n-1)。
代表a同学和b同学的试卷是相同的。
输出
每组输出一行,输出和你的试卷相同的同学的个数。
示例输入
5 2 0 1 1 2 5 2 1 2 2 3
示例输出
2 0
#include<stdio.h>
int bin[100002];
int find(int x)
{
int r = x;
while(bin[r] != r)
r = bin[r];
int j;
while( r != x)
{
j = bin[x];
bin[x] = r;
x = j;
}
return r;
}
void merge(int x, int y)
{
int fx, fy;
fx = find(x);
fy = find(y);
if(fx != fy && fx < fy)
bin[fy] = fx;
else if(fx != fy && fx > fy)
bin[fx] = fy;
}
int main()
{
int n, m, a, b, i, count = 0;
while(~scanf("%d %d", &n, &m))
{
count = 0;
for(i=0; i<n; i++)
bin[i] = i;
for(i=0; i<m; i++)
{
scanf("%d %d", &a, &b);
merge(a, b);
}
for(i = 1; i < n; i++)
{
if(find(bin[0]) == find(bin[i]))
{
count++;
}
}
printf("%d\n", count);
}
return 0;
}
注意:1. 今天交了三遍啊,RE了, 想来想去应该没错啊,注意了路径压缩。。。。。最后忽然想起来,看了看n的范围,瞬间石化了,原来我的数组开小了。。所以在这里说一下避免重蹈覆辙,
Runtime Error
你的程序发生了运行时错误。可能是由于除以0、数组越界或指针访问出错等运行时问题。
2. 今天学会路径压缩,加油!!!
每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。

浙公网安备 33010602011771号