食物链
这个题使用了带权并查集,需要知道的是d是个什么东西,然后就是看一下取模3之后是否为不合法(也就是假话)状态,如果是,则答案++,否则,状态进行修改。
#include <bits/stdc++.h>
using namespace std;
int p[100005],n,m,d[100005];
int find(int x){
if(p[x] != x){
int t = find(p[x]);
d[x] += d[p[x]];
p[x] = t;
}
return p[x];
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++) p[i] = i;
int res = 0;
while(m --){
int t,x,y;
cin >> t >> x >> y;
if(x > n || y > n) res ++;
else{
int px = find(x),py = find(y);
if(t == 1){
if(px == py && ((d[x] - d[y]) % 3)) res ++;
else if(px != py) {
p[px] = py;
d[px] = d[y] - d[x];
}
}else{
if(px == py && ((d[x] - d[y] - 1) % 3)) res ++;
else if(px != py) {
p[px] = py;
d[px] = d[y] + 1 - d[x];
}
}
}
}
cout << res << endl;
return 0;
}