代码对于样例输出:0 0 1,按照题意不应该是错的吗?
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6*2+7,M=N;
int n,m,dfn[N],low[N],new_g[N],cnt,idx=1,h[N],vis[N],tot;
int stk[N], top;
struct node {
int v, ne;
}e[M];
void add(int a,int b) {
e[++idx] = {b,h[a]};
h[a] = idx;
}
void tarjan(int u) {
dfn[u] = low[u] = ++tot;
stk[++top] = u;
vis[u] = 1;
for (int i = h[u]; i;i=e[i].ne) {
int v = e[i].v;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(vis[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u]==low[u]) {
int y;
cnt++;
while (1) {
y = stk[top];
new_g[y] = cnt;
top--;
vis[y] = 0;
if (y == u)break;
}
}
}
int main() {
cin >> n>>m;
for (int k = 1; k <= m;k++) {
int i,a,j, b;
scanf("%d%d%d%d",&i,&a,&j,&b);
add(i*2+!a,j*2+b);
add(j*2+!b,i*2+a);
}
for(int i=1;i<=n*2;i++)
if(!dfn[i])tarjan(i);
for (int i = 1; i <= n;i++) {
if (new_g[i*2]==new_g[i*2+1]) {
puts("IMPOSSIBLE");
return 0;
}
}
puts("POSSIBLE");
for (int i = 1; i <= n ; i++) {
if (new_g[i*2] < new_g[i*2 + 1]) {
printf("0 ");
}
else printf("1 ");
}
return 0;
}