并查集----(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. 今天学会路径压缩,加油!!!


 

posted @ 2014-02-24 10:38  6bing  阅读(147)  评论(0编辑  收藏  举报