P4782 【模板】2-SAT 问题
我...忘了输出POSSIBLE
总是会忘else if(inst[v]&&dfn[v]<low[u])是else if不是if!!!
然后tarjan要记得入栈...
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<cmath> #include<vector> #include<stack> #include<algorithm> using namespace std; #define Min(x,y) ((x)<(y)?(x):(y)) const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,P=9999973; int n,m; template <class t>void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; } int head[N],tot=0; struct edge{int u,v,nxt;}e[M<<1]; void add(int u,int v){ e[++tot]=(edge){u,v,head[u]},head[u]=tot; } stack<int>s; bool inst[N]; int idx=0,Bcnt=0,dfn[N],low[N],bl[N]; void tarjan(int u){ dfn[u]=low[u]=++idx; s.push(u),inst[u]=1; for(int i=head[u],v;i;i=e[i].nxt){ v=e[i].v; if(!dfn[v]) tarjan(v),low[u]=Min(low[u],low[v]); else if(inst[v]&&dfn[v]<low[u]) low[u]=dfn[v]; } if(dfn[u]==low[u]){ int v; ++Bcnt; do{ v=s.top(),s.pop(); inst[v]=0,bl[v]=Bcnt; }while(u!=v); } } int main(){ // freopen("in.txt","r",stdin); rd(n),rd(m); for(int i=1,x,xx,y,yy;i<=m;++i){ rd(x),rd(xx),rd(y),rd(yy); x=(x<<1)+xx,y=(y<<1)+yy; add(x,y^1),add(y,x^1); } for(int i=2;i<=(n<<1|1);++i) if(!dfn[i]) tarjan(i); for(int i=1;i<=n;++i) if(bl[i<<1]==bl[i<<1|1]) {puts("IMPOSSIBLE");return 0;} puts("POSSIBLE"); for(int i=1;i<=n;++i) printf("%d ",(bl[i<<1]<bl[i<<1|1])); return 0; }