悬5关
  • 板块学术版
  • 楼主focus_costan1
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/7 08:47
  • 上次更新2024/7/7 11:08:53
查看原帖
悬5关
1148600
focus_costan1楼主2024/7/7 08:47

三值逻辑

#include<bits/stdc++.h>
using namespace std;
int f[200005];
int sz[200005];
int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y){
	int f1=find(x);
	int f2=find(y);
//	cout<<f1<<" "<<f2<<"**"<<endl;
	if(f1==f2){
		return ;
	}
	f[f1]=f2;
	sz[f2]+=sz[f1];
}
char tfu[200005];
int main(){
	int c,t;
	scanf("%d%d",&c,&t);
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		memset(tfu,'0',sizeof tfu);
		for(int i=1;i<=2*n;i++){
			f[i]=i;
		}
		for(int i=1;i<=n;i++){
			sz[i]=1;
		}
		for(int i=n+1;i<=2*n;i++){
			sz[i]=0;
		}
		for(int i=1;i<=m;i++){
			char opt;
			cin>>opt;
			int x,y;
			scanf("%d",&x);
			if(opt=='T'){
				tfu[x]='T';
			}
			if(opt=='F'){
				tfu[x]='F';
			}
			if(opt=='U'){
				tfu[x]='U';
			}
			if(opt=='+'){
				int y;
				scanf("%d",&y);
				merge(x,y);
				merge(x+n,y+n);
			}
			if(opt=='-'){
				int y;
				scanf("%d",&y);
				merge(y+n,x);
				merge(x+n,y);
			}
		}
		for(int i=1;i<=n;i++){
			if(tfu[i]!='0'){
				tfu[find(i)]=tfu[i];
			}
		}
		int cnt=0;
		for(int i=1;i<=n;i++){
			if(find(i)==find(i+n)||tfu[find(i)]=='U'){
				cnt+=sz[find(i)];
		//		cout<<i<<" "<<sz[find(i)]<<endl;
				sz[find(i)]=0;
			}
		} 
		cout<<cnt<<endl;
	}
	return 0;
}
2024/7/7 08:47
加载中...