社区讨论

2-sat代码40pts求助

P4171[JSOI2010] 满汉全席参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjv1926
此快照首次捕获于
2025/11/04 08:58
4 个月前
此快照最后确认于
2025/11/04 08:58
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 100000
using namespace std;
int T,n,m,cnt=0,num=0,top=0,b=0;
int low[N],dfn[N],ins[N],s[N],scc[N];
vector<int>g[N];
int ms(int x){return (x<<1);}
int hs(int x){return (x<<1|1);}
void add(int from,int to){return g[from].push_back(to);}
void tarjan(int u);


int main()
{
	freopen("P4171_4.in.txt","r",stdin);
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			char a,b,c,d;
			cin>>a>>b>>c>>d;
			if(a=='m'){
				if(c=='m'){
					add(hs(b-'0'),ms(d-'0'));
					add(hs(d-'0'),ms(b-'0'));
				}
				else if(c=='h'){
					add(hs(b-'0'),hs(d-'0'));
					add(ms(d-'0'),ms(b-'0'));
				}
			}
			else if(a=='h'){
				if(c=='m'){
					add(ms(b-'0'),ms(d-'0'));
					add(hs(d-'0'),hs(b-'0'));
				}
				else if(c=='h'){
					add(ms(b-'0'),hs(d-'0'));
					add(ms(d-'0'),hs(b-'0'));
				}
			}
		}
		for(int i=2;i<((n+1)<<1);i++){
			if(dfn[i])continue;		
			tarjan(i);	
		}
		int b=0;
		for(int i=2;i<((n+1)<<1);i+=2){
			if(scc[i]==scc[i^1]){
				b=1;
				break;
			}
		}
		if(!b)cout<<"GOOD\n";
		else cout<<"BAD\n";
		cnt=0,num=0,top=0;
		for(int i=2;i<((n+1)<<1);i++){
			dfn[i]=low[i]=0;
			ins[i]=s[i]=scc[i]=0;
			g[i].clear();
		}
	}
	return 0;
}
void tarjan(int u){
	low[u]=dfn[u]=++cnt;
	ins[u]=1;
	s[++top]=u;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(!dfn[v]){ 
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		if(ins[v])
			low[u]=min(low[u],dfn[v]); 
	}
	if(low[u]==dfn[u]){
		num++;
		while(1){
			ins[s[top]]=0;
			scc[s[top]]=num;
			if(s[top--]==u)break;
		}
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...