Cod sursa(job #2921289)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 29 august 2022 22:25:52
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin ("2sat.in");
ofstream fout("2sat.out");

const int dim=2e5+9;

vector<int>adj[dim];
vector<int>adj_t[dim];

bool vizitat[dim];
int ordine[dim],len;
int ans[dim],comp[dim];

void dfs1(int x){
    vizitat[x]=true;
    for(int y:adj[x]){
        if(!vizitat[y]){
            dfs1(y);
        }
    }
    ordine[++len]=x;
}

void dfs2(int x,int nr){
    comp[x]=nr;
    for(int y:adj_t[x]){
        if(!comp[y]){
            dfs2(y,nr);
        }
    }
}

void add(int a,bool na,int b,bool nb){
    a=2*a^na;
    b=2*b^nb;
    int neg_a=a^1;
    int neg_b=b^1;
    adj[neg_a].push_back(b);
    adj[neg_b].push_back(a);
    adj_t[b].push_back(neg_a);
    adj_t[a].push_back(neg_b);
}

signed main(){
    int n,m;
        fin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        fin>>x>>y;
        add(abs(x)-1,(x<0),abs(y)-1,(y<0));
    }
    for(int i=0;i<2*n;i++){
        if(!vizitat[i]){
            dfs1(i);
        }
    }
    int nr_comp=1;
    for(int i=len;i>=1;i--){
        int x=ordine[i];
        if(!comp[x]){
            dfs2(x,nr_comp);
            nr_comp++;
        }
    }
    for(int i=0;i<2*n;i+=2){
        if(comp[i]==comp[i+1]){
            fout<<-1;
            return 0;
        }
        ans[i/2]=comp[i]>comp[i+1];
    }
    for(int i=0;i<n;i++){
        fout<<ans[i]<<' ';
    }
}