题目
题目
s
u
m
=
0
sum=0
sum=0代表
x
x
x与
f
x
fx
fx为同类
s
u
m
=
1
sum=1
sum=1代表
x
x
x吃
f
x
fx
fx
s
u
m
=
2
sum=2
sum=2代表
f
x
fx
fx吃
x
x
x
思路
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int f[50010];
int sum[50010];
int find(int x){
if(f[x]==x) return x;
int tmp=f[x];
f[x]=find(f[x]);
sum[x]=(sum[x]+sum[tmp])%3;
return f[x];
}
int main(){
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) f[i]=i;
int ans=0;
for(int i=1;i<=k;i++){
int d,a,b;
scanf("%d%d%d",&d,&a,&b);
if(a>n||b>n){
ans++;
continue;
}
int fa=find(a);
int fb=find(b);
if(d==1){
if(fa!=fb){
f[fb]=fa;
sum[fb]=(sum[a]-sum[b]+3)%3;
}
else{
if(sum[b]!=sum[a]) ans++;
}
}
else{
if(a==b) ans++;
else{
if(fa!=fb){
f[fb]=fa;
sum[fb]=(sum[a]-sum[b]+1+3)%3;
}
else{
if(sum[b]!=(1+sum[a])%3) ans++;
}
}
}
}
printf("%d\n",ans);
return 0;
}
//