并查集----(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. 今天学会路径压缩,加油!!!
每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。