题目大意:存在三类动物, A,B, C三类; 关系是 A 吃 B , B 吃 C, C 吃 A;
题目给定动物总数量N, 以及关系数 K
然后给定K 条关系, 有两种说法
1: x 和 y 同类
2: x 吃 y
答题思路:
用三个并查集同时维护关系, A - A+ N 代表 吃的关系, 比如 x 与 y + N 属同一集合 则关系为 x 吃 y ;
同理 y + N 与 x + 2 * N 关系为 y 吃 x ;
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int par[200000];
int Rank[200000];
void init(int n)
{
for(int i=0; i<n; i++)
{
par[i] = i;
Rank[i] = 0;
}
}
int find_par(int n)
{
if(par[n] == n) return n;
return par[n] = find_par(par[n]);
}
void unit_par(int a, int b)
{
a = find_par(a);
b = find_par(b);
if(a == b) return;
if(Rank[a] < Rank[b]) par[a] = b;
else
{
par[b] = a;
if(Rank[a] == Rank[b]) Rank[a]++;
}
}
bool same(int a, int b)
{
return find_par(a) == find_par(b);
}
int main()
{
int N, k;
scanf("%d%d", &N, &k);
int d, x, y;
int cnt = 0;
init(N*3);
while(k--)
{
scanf("%d%d%d", &d, &x, &y);
if(x <= 0 || y<= 0 || x > N || y > N)
{
cnt ++;
continue;
}
if(d == 1)
{
if(same( x, y+N) || same(x, y+N*2))
{
cnt++;
continue;
}
unit_par(x, y);
unit_par(x+N, y+N);
unit_par(x+N*2, y+N*2);
}
else
{
if(same(x, y) || same(x, y+N*2))
{
cnt++;
continue;
}
unit_par(x, y+N);
unit_par(x+N, y+N*2);
unit_par(x+N*2, y);
}
}
printf("%d\n", cnt);
return 0;
}