Cod sursa(job #2484110)

Utilizator bogdi1bogdan bancuta bogdi1 Data 30 octombrie 2019 18:06:52
Problema 2SAT Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> g[200005];
vector<int> gt[200005];
vector<int> l;
vector<int> comp[200005];
int pred[200005];
vector<int> succ[200005];
int val[200005];
bool ans[200005];
bool viz[200005];
int f[200005];
queue<int> q;
int cont;
void dfs(int nod)
{
    viz[nod]=1;
    for(int v : g[nod])
        if(!viz[v])
            dfs(v);
    l.push_back(nod);
}
void dfst(int nod)
{
    viz[nod]=1;
    for(int v : gt[nod])
        if(!viz[v])
            dfst(v);
    comp[cont].push_back(nod);
    f[nod]=cont;
}
int main()
{   freopen("2sat.in", "r", stdin);
    freopen("2sat.out", "w", stdout);
    int n,m,i,x,y,j;
    bool curx,cury,antx,anty;
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &x, &y);
        curx=cury=0;
        antx=anty=1;
        if(x<0){
            curx=1;
            antx=0;
            x*=-1;
        }
        if(y<0){
            cury=1;
            anty=0;
            y*=-1;
        }
        g[2*x+antx].push_back(2*y+cury);
        g[2*y+anty].push_back(2*x+curx);
        gt[2*y+cury].push_back(2*x+antx);
        gt[2*x+curx].push_back(2*y+anty);
    }
    for(i=1; i<=2*n+1; i++)
        val[i]=-1;
    for(i=2; i<=2*n+1; i++)
        if(!viz[i])
            dfs(i);
    reverse(l.begin(), l.end());
    for(int u : l)
        viz[u]=0;
    for(int u : l){
        if(!viz[u]){
            cont++;
            dfst(u);
        }
    }
    for(i=2; i<=2*n+1; i++){
        if(f[(i/2)*2+(i%2+1)%2]==f[i]){
            printf("-1");
            return 0;
        }
        for(j=0; j<g[i].size(); j++)
            if(f[i]!=f[g[i][j]]){
                pred[f[g[i][j]]]++;
                succ[f[i]].push_back(f[g[i][j]]);
            }
    }
    for(i=1; i<=cont; i++)
        if(pred[i]==0)
            q.push(i);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(val[f[(comp[u][0]/2)*2+(comp[u][0]%2+1)%2]]!=-1)
            val[u]=(val[f[(comp[u][0]/2)*2+(comp[u][0]%2+1)%2]]+1)%2;
        else{
            val[u]=0;
            for(i=0; i<succ[u].size(); i++){
                pred[succ[u][i]]--;
                if(pred[succ[u][i]]==0)
                    q.push(succ[u][i]);
            }
        }
    }
    for(i=1; i<=cont; i++)
        for(j=0; j<comp[i].size(); j++)
            ans[comp[i][j]]=val[i];
    for(i=2; i<=2*n; i+=2)
        printf("%d ", ans[i]);
    return 0;
}