Mai intai trebuie sa te autentifici.

Cod sursa(job #2689984)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 22 decembrie 2020 19:04:20
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
#define NMAX 100000

using namespace std;

ifstream fi("2sat.in");
ofstream fo("2sat.out");

int n,m,x,y;
vector<int> G[2*NMAX+5],GT[2*NMAX+5];
int viz[2*NMAX+5];
int ord[2*NMAX+5],k;
vector<int> ctc[2*NMAX+5];
int comp[2*NMAX+5],nrc;

int codif(int val){
    if(val<0){
        return 2*(-val);
    }
    return 2*val+1;
}

int inv(int val){
    return codif(-val);
}

void dfst(int nod){
    viz[nod]=1;
    for(int i=0;i<GT[nod].size();i++){
        if(!viz[GT[nod][i]]){
            dfst(GT[nod][i]);
        }
    }
    ord[++k]=nod;
}

void dfs(int nod){
    viz[nod]=1;
    for(int i=0;i<G[nod].size();i++){
        if(!viz[G[nod][i]]){
            dfs(G[nod][i]);
        }
    }
    ctc[nrc].push_back(nod);
}

int main(){
    fi>>n>>m;
    for(int i=1;i<=m;i++){
        fi>>x>>y;
        G[inv(x)].push_back(codif(y));
        G[inv(y)].push_back(codif(x));
        GT[codif(y)].push_back(inv(x));
        GT[codif(x)].push_back(inv(y));
    }
    for(int i=2;i<=2*n+1;i++){
        if(!viz[i]){
            dfst(i);
        }
    }
    for(int i=2;i<=2*n+1;i++){
        viz[i]=0;
    }
    for(int i=2*n+1;i>=1;i--){
        if(!viz[ord[i]]){
            ++nrc;
            dfs(ord[i]);
        }
    }
    for(int i=1;i<=nrc;i++){
        for(int j=0;j<ctc[i].size();j++){
            comp[ctc[i][j]]=i;
        }
    }
    for(int i=1;i<=n;i++){
        if(comp[2*i]==comp[2*i+1]){
            fo<<-1;
            fi.close();
            fo.close();
            return 0;
        }
    }
    for(int i=1;i<=n;i++){
        if(comp[2*i]<comp[2*i+1]){
            fo<<0<<' ';
        }else{
            fo<<1<<' ';
        }
    }    
}