社区讨论
疑似UB
P4782【模板】2-SAT参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mjfrboic
- 此快照首次捕获于
- 2025/12/21 21:22 2 个月前
- 此快照最后确认于
- 2025/12/24 19:05 2 个月前
下载样例过后,本代码输出了正确的构造,但是显示O分。疑似触发UB,但又找不出来。
样例1:
CPP10 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
我的输出:
CPPPOSSIBLE
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 条回复,欢迎继续交流。
正在加载回复...