捞:https://www.luogu.com.cn/discuss/758772
疑惑:
这是现在的code:
#include<bits/stdc++.h>
#define N 4000010
using namespace std;
int n, m, u, v, tot, dcccnt, cnt, top;
int h[N], dfn[N], low[N], col[N], st[N];
bool a, b;
struct node{
int ne, to;
}G[N];
void add(int u, int v){
G[++tot] = {h[u], v};
h[u] = tot;
}
void tarjan(int u){
dfn[u] = low[u] = ++dcccnt;
st[top++] = u;
for(int i = h[u]; i; i = G[i].ne){
int v = G[i].to;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(!col[v]) low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u]){
cnt++;
while(true){
int t = st[--top];
col[t] = cnt;
if(t == u) break;
}
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d %d %d %d", &u, &a, &v, &b);
add(u + (a ^ 1) * n, v + b * n);
add(v + (b ^ 1) * n, u + a * n);
}
for(int i = 1; i <= n * 2; i++){
if(!dfn[i]) tarjan(i);
}
for(int i = 1; i <= n; i++){
if(col[i] == col[i + n]){
printf("IMPOSSIBLE");
return 0;
}
}
puts("POSSIBLE");
for(int i = 1; i <= n; i++) printf("%d ", col[i] > col[i + n]);
return 0;
}
Luogu样例#1:
输入:
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
我的输出:
POSSIBLE
0 1 0 0 0 0 0 1 1 1
Luogu显示WA,原因:
Wrong Answer.wrong answer Wrong in No.4 clause , input is {10,1,2,1} , your xval is 0 , yval is 0
即:x10 和 x2 应该有一个为1,但输出中 x10 和 x2 都为0。
但是我的本地样例输出中 x10 和 x2 都为1?
求解释+悬关。