求助30
查看原帖
求助30
235901
Always_Remember_It楼主2024/7/24 14:49
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char op[N],x[N];
int a[N],b[N];
int head[N],tot,cnt;
bool in[N],vis[N],able[N];
struct Edge{
	int next,to,val;
}e[N];
void adde(int u,int v,int w){
	e[++tot].next=head[u];
	e[tot].to=v;
	e[tot].val=w;
	head[u]=tot;
	return;
}
void dfs1(int u,int now,int s){
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to,w=e[i].val;
		if(v==s){
			//cout<<now+w<<endl;
			if((now+w)&1) able[s]=1;
			continue;
		}
		if(vis[v]) continue;
		vis[v]=1;
		dfs1(v,now+w,s);
	}
	return;
}
void dfs2(int u,int s){
	++cnt;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==s) continue;
		dfs2(v,s);
	}
	return;
}
int main(){
	//freopen("tribool.in","r",stdin);
	//freopen("tribool.out","w",stdout);
	int c,t;cin>>c>>t;
	while(t--){
		memset(in,0,sizeof(in));
		memset(head,0,sizeof(head));
		memset(e,0,sizeof(e));
		memset(vis,0,sizeof(vis));
		memset(able,0,sizeof(able));
		tot=cnt=0;
		int n,m;cin>>n>>m;
		for(int i=1;i<=n;i++){
			x[i]=' ';
		}
		for(int i=1;i<=m;i++){
			cin>>op[i]>>a[i];
			if(op[i]=='+'||op[i]=='-') cin>>b[i];
		}
		for(int i=m;i>=1;i--){
			if(in[a[i]]) continue;
			if(op[i]=='T'||op[i]=='F'||op[i]=='U'){
				if(!in[a[i]]) x[a[i]]=op[i];
				in[a[i]]=1;
			}
			else{
				if(a[i]==b[i]){
					if(op[i]=='+') continue;
					in[a[i]]=1;
					++cnt;
					continue;
				}
				if(!in[a[i]]){
					if(op[i]=='+') adde(b[i],a[i],0);
					else adde(b[i],a[i],1);
					in[a[i]]=1;
				}
			}
		}
		for(int i=1;i<=n;i++){
			//cout<<x[i]<<" ";
			if(!vis[i]){
				vis[i]=1;
				dfs1(i,0,i);
			}
		}
		//memset(vis,0,sizeof(vis));
		/*for(int i=1;i<=n;i++){
			cout<<able[i]<<" ";
		}*/
		//cout<<endl;
		for(int i=1;i<=n;i++){
			if(x[i]=='U'||able[i]) dfs2(i,i);
		}
		cout<<cnt<<endl;
	}
	return 0;
}
2024/7/24 14:49
加载中...