2-SAT模板

image

image

洛谷p4782

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n,m;
int dfn[N],low[N],stk[N],instk[N],tot,cnt,scc[N],top;
vector<int> edges[N];

void tarjan(int u){
    dfn[u]=low[u]=++tot;
    stk[++top]=u;
    instk[u]=1;
    for(int &v:edges[u]){
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(instk[v]){
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(low[u]==dfn[u]){
        int v;
        cnt++;
        do{
            v=stk[top--];
            instk[v]=0;
            scc[v]=cnt;
        }while(v^u);
    }
}

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>m;
    while(m--){
        int i,a,j,b;
        cin>>i>>a>>j>>b;
        edges[i+!a*n].push_back(j+b*n);
        edges[j+!b*n].push_back(i+a*n);
    }
    for(int i=1;i<=n+n;i++){
        if(!dfn[i]){
            tarjan(i);
        }
    }
    for(int i=1;i<=n;i++){
        if(scc[i]==scc[i+n]){
            cout<<"IMPOSSIBLE"<<endl;
            return 0;
        }
    }
    cout<<"POSSIBLE"<<endl;
    for(int i=1;i<=n;i++){
        cout<<(scc[i]>scc[i+n])<<' ';
    }
    return 0;
}
posted @ 2025-10-05 21:20  xdhking  阅读(8)  评论(0)    收藏  举报