NOI 2001 食物链 并查集A的第一题。

  这题确定的是1 ~ N 动物的三角捕食关系。

  因为可能存在多个三角圈。所以在设置的时候用find这个函数来确定三角的源头。

  就比如说 a , b ,c ,d ,e ,f , g 他们在不同的三角捕食关系中,但是他们是在总三角关系的同一个等级中。那么我们把p[b] = a , p[c] = a , ... 让他们的源头都指向a,这样每次比较都是用源头a来进行,就不会忽略已有的情况或者发生矛盾了。

#include<cstdio>
#define lie {cnt++;continue;}
#define rise(i,a,b) for(int i=a;i<=b;i++)
const int MAXN = 100000 * 3 + 1; 
int p[MAXN], fa[MAXN];
void pre( int n )
/* to make original Triangle predator-prey relationships. && the sourse of every number. */
{
	rise( i , 1 , 3 * n ) p[i] = i;
	rise( i , 1 , n )
	{
		fa[i] = i + n;
		fa[ i + n ] = i + n + n;
		fa[ i + n + n ] = i; 
	}
}
int find( int x )
/*  to find the source of x, such as if a <=> b , b <=> c , c <=> d , ... , ( a , b , c , d ... are in the same level ) we use a to represent b , c , d ... */
{
    if( x != p[x] ) p[x] = find( p[x] );
    return p[x];
}
int doit( int k , int n )
{
	int cnt = 0, w, x, y;
	rise( i , 1 , n )
	{
	    scanf( "%d%d%d" , &w, &x, &y );
	    if( x > k || y > k ) lie;
	    int a[3], b[3];
	    /* a[i] is the Triangle predator-prey relationships of a[0]. */
        a[0] = find(x)  ; b[0] = find(y)  ;
        a[1] = fa[a[0]] ; b[1] = fa[b[0]] ;
        a[2] = fa[a[1]] ; b[2] = fa[b[1]] ;
        bool flag = false;
        rise( i , 0 , 2 )
        if( a[0] == b[i] )
        {
        	flag = true;
        	break;
        }
        /* if flag == true , it means x , y has some relationship.*/
        if( w == 1 )/* if x , y in the same level. */ 
        {
        	if( flag && a[0] != b[0] ) lie;
        	if( !flag )
        	rise( i , 0 , 2 )
        	p[ b[i] ] = a[i];
        	/* make a[i] the sourse of b[i]. */
        }
        else if( w == 2 )
        {
        	if( x == y ) lie;
        	if( !flag )
        	rise( i , 0 , 2 )
        	p[ b[i] ] = a[ ( i + 2 ) % 3 ];
            else 
            {
            	if( fa[ b[0] ] != a[0] ) lie;
            }
        }
	}
	return cnt;
}
int main()
{
	int n, k, cnt = 0, type = 0;
	scanf( "%d%d", &k, &n );
    pre( n );
 	printf( "%d\n" , doit( k , n ) );
	return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值