社区讨论

疑似UB

P4782【模板】2-SAT参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mjfrboic
此快照首次捕获于
2025/12/21 21:22
2 个月前
此快照最后确认于
2025/12/24 19:05
2 个月前
查看原帖
下载样例过后,本代码输出了正确的构造,但是显示O分。疑似触发UB,但又找不出来。
样例1:
CPP
10 10
3 0 2 0
10 1 9 0
2 1 4 0
10 1 2 1
2 1 2 0
10 1 9 1
2 1 4 0
10 0 9 1
1 1 8 1
8 0 2 1
我的输出:
CPP
POSSIBLE
0 1 0 0 0 0 0 1 1 1
查了好几遍都没查出来我这个构造的错误,但是显示0分。
还有吐槽那提示信息,即使有spj源码也真的看不懂,反人类。
CPP
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int n,m,x1,x2,cnt,scc;
int dfn[2000002],low[2000002],bel[2000002];
bool t1,t2,vis[2000002],ins[2000002];
vector<int> g[2000002];
stack<int> s;
void tarjan(int x){
	dfn[x]=cnt,low[x]=cnt,cnt++,vis[x]=1,ins[x]=1,s.push(x);
	for(auto i:g[x]){
		if(!vis[i])tarjan(i),low[x]=min(low[x],low[i]);
		else if(ins[i])low[x]=min(low[x],dfn[i]);
	}if(!(dfn[x]^low[x])){
		while(s.top()!=x)bel[s.top()]=scc,ins[s.top()]=0,s.pop();
		bel[s.top()]=scc,ins[s.top()]=0,s.pop(),scc++;
	}return;
}int main(){
	//freopen("1.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++){
		scanf("%d%d%d%d",&x1,&t1,&x2,&t2);
		g[x1+(!t1)*n].push_back(x2+t2*n);
		g[x2+(!t2)*n].push_back(x1+t1*n);
	}for(int i=0;i<=(n<<1);i++)if(!vis[i])tarjan(i);
	for(int i=1;i<=n;i++){
		if(!(bel[i]^bel[i+n])){
			puts("IMPOSSIBLE");
			return 0;
		}
	}puts("POSSIBLE");
	for(int i=1;i<=n;i++)putchar((bel[i]>bel[i+n])+'0'),putchar(' ');
	return 0;
}

回复

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

正在加载回复...