【POJ 1182】【并查集】食物链

  第一次做这题的时候是学姐出小乌龟成长计划的并查集专题,结果当时我就做了前面几个水题,后面的实在做不出,今天在书上也看到这题,依旧懵逼,所以百度看了解释,好像有点会了。

 一种是书上的解法,很巧妙,还有一种是加权并查集,有通用性,两种都值得学习。上代码。。。只有一组数据!!!!我就说我怎么迷之WA。



#include "stdio.h"
int f[150010];
void init(int n);
int find(int x);
void join(int x, int y);
int n,k;
int main(int argc, char const *argv[])
{
    scanf("%d%d", &n, &k);
	int a,b,r;
	int num=0;
	init(n);
	while (k--)
	{
		scanf("%d %d %d",&r,&a,&b);
		if(a>n || b>n)
		{
			num++;
			//printf("1\n");
			continue;
		}
		if(r==1)
		{   //printf("1\n");
			if ((find(a)==find(b+n))||(find(a)==find(b+2*n)))
				num++;
			else
            {
            	//printf("1\n");
                join(a,b);
                join(a+n,b+n);
                join(a+n*2,b+2*n);
            }
        }
        if(r==2)
        {
        	//printf("1\n");
        	if ((find(a)==find(b))||(find(a)==find(b+2*n)))
        		num++;
            else
            {
            	//printf("1\n");
            	join(a+2*n,b);
                join(a,b+n);
                join(a+n,b+2*n);
            }
        }
    }
    printf("%d\n", num);
    return 0;
}
void init(int n)
{
    for (int i = 1; i < 3*n; i++)
        f[i] = i;
}
int find(int x)
{
    if (f[x] == x)
        return x;
    else
        return f[x] = find(f[x]);
}
void join(int x, int y)
{
    int x2 = find(x);
    int y2 = find(y);
    if (x2 != y2)
        f[x2] = y2;
}


你可能感兴趣的:(c,并查集)