Cod sursa(job #1213808)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 28 iulie 2014 23:50:55
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <stack>
#include <set>

using namespace std;

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

set <int> r;
stack <int> s;
vector <int> l[200010];

int low[200010],niv[200010],w[200010];
int n,m,x,y,ok,g,i,j;

void dfs (int nod) {

   niv[nod]=low[nod]=++g;
   s.push(nod);
   for (int i=0;i<l[nod].size();i++) {
       if (niv[l[nod][i]]==0)
            dfs(l[nod][i]);
        if (niv[l[nod][i]]>0)
            low[nod]=min(low[nod],low[l[nod][i]]);
   }
   if (low[nod]==niv[nod]) {
       r.clear();
       do {
            x=s.top();
            s.pop();
            if ((x<=n && r.find(x+n)!=r.end()) || (x>n && r.find(x-n)!=r.end()))
                ok=1;
            r.insert(x);

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

int main () {

    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y;
        if (x>0){
            if (y>0) {
                l[x+n].push_back(y);
                l[y+n].push_back(x);
            }else {
                l[x+n].push_back(-y+n);
                l[-y].push_back(x);
            }
        }else{
            if (y>0) {
                l[-x].push_back(y);
                l[y+n].push_back(-x+n);
            }else{
                l[-x].push_back(-y+n);
                l[-y].push_back(-x+n);
            }
        }
    }

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

    if (ok)
        fout<<"-1\n";
    else
        for (i=1;i<=n;i++)
            fout<<(w[i]==1?1:0)<<" ";

    return 0;
}