Cod sursa(job #2530391)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 24 ianuarie 2020 19:02:22
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>

#define dim 100001
using namespace std;

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

int n,m,i,j,lvl,x,sol;
int niv[2*dim],low[2*dim],w[2*dim];
bitset <2*dim> f,r;
deque <int> q;
vector <int> l[2*dim];

void dfs(int nod){
    lvl++;
    niv[nod]=lvl;
    low[nod]=lvl;
    q.push_back(nod);
    f[nod]=1;

    for(int i=0;i<l[nod].size();i++){
        int vec=l[nod][i];

        if(niv[vec]==0){
            dfs(vec);
            low[nod]=min(low[nod],low[vec]);
        }else
            if(f[vec])
                low[nod]=min(low[nod],niv[vec]);
    }

    if(low[nod]==niv[nod]){
        r.reset();

        do{
            x=q.back();
            q.pop_back();
            f[x]=0;

            if((x<=n && r[x+n]) || (x>n && r[x-n]))
                sol=-1;
            r[x]=1;

            if(w[x]==0){
                w[x]=1;

                if(x<=n)
                    w[x+n]=-1;
                else
                    w[x-n]=-1;
            }
        }while(x!=nod);
    }
}

int main(){
    fin>>n>>m;
    for(;m;m--){
        fin>>i>>j;

        if(i>0){
            if(j>0){
                l[i+n].push_back(j);
                l[j+n].push_back(i);
            }else{
                l[i+n].push_back(-j+n);
                l[-j].push_back(i);
            }
        }else{
            if(j>0){
                l[-i].push_back(j);
                l[j+n].push_back(-i+n);
            }else{
                l[-i].push_back(-j+n);
                l[-j].push_back(-i+n);
            }
        }
    }

    for(i=1;i<=2*n;i++)
        if(w[i]==0)
            dfs(i);

    if(sol==-1)
        fout<<"-1";
    else
        for(i=1;i<=n;i++)
            fout<<min(w[i]+1,1)<<" ";

    return 0;
}