2-sat板子

vector<int>e[maxn];
int n,m;
int inscc[maxn];
int low[maxn],dfn[maxn];
stack<int>stk;
int instk[maxn];
int tot,cnt;
vector<int>scc[maxn];

void dfs(int u,int fa){
    low[u]=dfn[u]=++tot;
    stk.push(u);
    instk[u]=1;
 
    for(int v:e[u]){
        if(!dfn[v]){//树边
            dfs(v,u);
            low[u] =min(low[u],low[v]);
        }else if(instk[v]){//非树边
            low[u] = min(low[u],dfn[v]);
        }
    }
 
    if(dfn[u]==low[u]){
        ++cnt;
        //处理非根节点
        while(stk.top()!=u){
            scc[cnt].pb(stk.top());
            inscc[stk.top()]=cnt;
            instk[stk.top()]=0;
            stk.pop();
        }
        //处理根节点
        scc[cnt].pb(stk.top());
        inscc[stk.top()]=cnt;
        instk[stk.top()]=0;
        stk.pop();
    }
}
void solve(){
    cin>>n>>m;
    rep(i,1,m){
        int idx,a,jdx,b;cin>>idx>>a>>jdx>>b;
        int x=idx,y=jdx;
        int nota= (a^1),notb =(b^1);
        e[x+nota*n].pb(y+b*n);
        e[y+notb*n].pb(x+a*n);
    }

    for(int i=1;i<=2*n;i++){
        if(inscc[i])continue;
        dfs(i,0);
    }

    for(int i=1;i<=n;i++){
        if(inscc[i]==inscc[i+n]){
            cout<<"IMPOSSIBLE"<<endl;return;
        }
    }

    cout<<"POSSIBLE"<<endl;
    for(int i=1;i<=n;i++){
        if(inscc[i]>inscc[i+n]){
            cout<<1<<' ';
        }else cout<<0<<' ';
    }
    cout<<endl;
}
posted @ 2025-09-18 17:08  Marinaco  阅读(6)  评论(0)    收藏  举报
//雪花飘落效果