并查集 poj1182

#include <iostream>
#include <stdio.h>

using namespace std;

const int maxNodes = 50010;
int father[maxNodes];
int rank[maxNodes];//此处rank的意义不一样
//此题最后所有的点都属于一个类

int N,K,c;

void init()
{
	for (int i=1;i<=N;++i)
	{
		father[i] = i;
		rank[i] = 0;
	}
}

int findSet(int x)//一边搜索一边压缩路径,建立成高度为1的树的形势,并重新计算x与新父节点的关系
{
	if(x == father[x])
		return father[x];

	int p = father[x];//x之前的父节点
	father[x] = findSet(father[x]);
	rank[x] = (rank[x] + rank[p])%3;

	return father[x];
}

void merge(int x,int y)//如果x,y没有关系,就要把x,y的关系加入
{
	int ra = father[x];
	int rb = father[y];
	/*int ra = findSet(x);
	int rb = findSet(y);*/
	father[ra] = rb;

	rank[ra] = (c -1 +rank[y]-rank[x] +3)%3;
	//rank[ra] = (-c +1 -rank[y]+rank[x] +3)%3;
}

int main()
{
	scanf("%d%d",&N,&K);
	
		init();
		int ans = 0;
		for (int i=0;i<K;++i)
		{
			
			int a,b;
			scanf("%d%d%d",&c,&a,&b);
			if(a>N||b>N||(c==2 && a==b))
			{
				//cout<<i +1<<endl;
				++ans;
				continue;
			}
			int ra = findSet(a);
			int rb = findSet(b);
			
			if(ra == rb)//说明a和b的关系已经存在,只需要验证即可
			{
				if((rank[a] - rank[b]+3)%3!=c -1)
				{
					//cout<<i +1<<endl;
					++ans;
				}
			}
			else//a和b的关系还没有确定,这句话是对的
				merge(a,b);
		}
		cout<<ans<<endl;
	
	
	return 0;
}

竟然不是多组数据,就一组数据,太坑爹了

哥写了循环接收的,就是wa

只接收一组的,就ac了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值