P4782 2—SAT

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

int main()
{   
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n,m;
    cin>>n>>m;
    vector<vector<int>>g(2*n);

    for(int i=0;i<m;i++){
        int x,a,y,b;
        cin>>x>>a>>y>>b;
        x--,y--;
        g[x+(a^1)*n].push_back(y+b*n);
        g[y+(b^1)*n].push_back(x+a*n);
    }
    vector<int>scc(2*n),ins(2*n),dfn(2*n),low(2*n);
    int idx=0,cnt=0;
    stack<int>stk;
    auto dfs=[&](auto &&self,int x)->void{
        dfn[x]=low[x]=++idx;
        stk.push(x);
        ins[x]=1;
        for(auto y:g[x]){
            if(!dfn[y]){
                self(self,y);
                low[x]=min(low[x],low[y]);
            }else if(ins[y]){
                low[x]=min(low[x],dfn[y]);
            }
        }
        if(low[x]==dfn[x]){
            int y;
            cnt++;
            do{
                y=stk.top();
                stk.pop();
                ins[y]=0;
                scc[y]=cnt;
            }while(y!=x);
        }
        return ;
    };
    for(int i=0;i<2*n;i++){
        if(!dfn[i]){
            dfs(dfs,i);
        }
    }
    vector<int>ans(n);
    for(int i=0;i<n;i++){
        if(scc[i]==scc[i+n]){
            cout<<"IMPOSSIBLE"<<'\n';
            return 0;
        }else if(scc[i]>scc[i+n]){
            ans[i]=1;
        }
    }
    cout<<"POSSIBLE"<<"\n";
    for(int i=0;i<n;i++){
        cout<<ans[i]<<" ";
    }
    
}

posted @ 2024-12-25 15:35  Koziki  阅读(12)  评论(0)    收藏  举报