三值逻辑
#include<bits/stdc++.h>
using namespace std;
int f[200005],size[200005];
int vis[200005];
char tfu[200005];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y){
int x1=find(x);
int x2=find(y);
if(x1==x2){
return ;
}
f[x1]=x2;
size[y]+=size[x];
}
int main(){
int c,t;
scanf("%d%d",&c,&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=2*n;i++){
f[i]=i;
size[i]=1;
}
for(int i=1;i<=n;i++){
char s;
int x,y;
cin>>s;
if(s=='T'){
cin>>x;
}
if(s=='F'){
cin>>x;
}
if(s=='U'){
cin>>x;
merge(x,x+n);
}
if(s=='+'){
cin>>x>>y;
merge(x,y);
merge(x+n,y+n);
}
if(s=='-'){
cin>>x>>y;
merge(x,y+n);
merge(x+n,y);
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(find(i)==find(i+n)&&vis[find(i)]==0){
vis[find(i)]=1;
cnt+=size[find(i)];
}
}
cout<<cnt<<endl;
}
return 0;
}