食物链 |
---|
题意: 一个食物链中,只有A吃B,B吃C,C吃A三层关系。给出m对关系判断是否有违背的关系。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define _for(i, a, b) for(int i = (a); i <= (b); ++i)
const int N = 5e4 + 10;
int n, k, ans;
int d, x, y;
int s[3 * N];
int h[3 * N];
int find(int x) { return s[x] == x ? x : s[x] = find(s[x]);}
void un(int a, int b) {
a = find(a), b = find(b);
if(h[a] < h[b]) s[a] = b;
else {
if(h[a] == h[b]) h[a]++;
s[b] = a;
}
}
int main() {
scanf("%d%d", &n, &k);
_for(i, 1, 3 * n) s[i] = i;
while(k--) {
scanf("%d%d%d", &d, &x, &y);
if((x == y && d == 2) ||x > n || x < 1 || y > n || y < 1) { ans++; continue;}
if(d == 1) {
if(find(x) == find(y + n) || find(x) == find(y + 2 * n)) ans++;
else {
un(x, y);
un(x + n, y + n);
un(x + 2 * n, y + 2 * n);
}
} else {
if(find(x) == find(y) || find(x) == find(y + 2 * n)) ans++;
else {
un(x, y + n);
un(x + n, y + 2 * n);
un(x + 2 * n, y);
}
}
}
printf("%d\n", ans);
return 0;
}