Cod sursa(job #2239805)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 11 septembrie 2018 21:31:48
Problema 2SAT Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
# include <fstream>
# include <vector>
# include <stack>
# define DIM 200010
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
stack<int> s,q;
vector<int> Lista[DIM];
int Marcat[DIM],low[DIM],niv[DIM],viz[DIM],n,m,x,y,i,t,ok;
int rv(int x){
    if(x<=n)
        return x+n;
    else
        return x-n;
}
void tarjan(int nc){
    if(ok)
        return;
    t++;
    low[nc]=niv[nc]=t;
    s.push(nc);
    for(int i=0;i<Lista[nc].size();i++){
        if(ok)
            return;
        int nv=Lista[nc][i];
        if(niv[nv]==0)
            tarjan(nv);
        if(viz[nv]==0)
            low[nc]=max(low[nc],low[nv]);
    }
    if(low[nc]==niv[nc]){
        int val=0;
        while(s.top()!=nc){
            val=max(val,Marcat[s.top()]);
            int nv=s.top();
            if(((viz[nv]||viz[rv(nv)])&&(!viz[nc]))||(((!viz[nv])||(!viz[rv(nv)]))&&viz[nc])){
                fout<<"-1\n";
                ok=1;
                return;
            }
            q.push(s.top());
            s.pop();
        }
        val=max(val,Marcat[s.top()]);
        q.push(s.top());
        s.pop();
        if(val==0)
            val=1;
        while(!q.empty()){
            Marcat[q.top()]=val;
            Marcat[rv(q.top())]=3-val;
            viz[q.top()]=1;
            q.pop();
        }
    }
}
int main () {
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        if(x<0)
            x=-x+n;
        if(y<0)
            y=-y+n;
        Lista[rv(x)].push_back(y);
        Lista[rv(y)].push_back(x);
    }
    for(i=1;i<=2*n;i++){
        if(niv[i]==0)
            tarjan(i);
        if(ok)
            return 0;
    }
    for(i=1;i<=n;i++)
        fout<<Marcat[i]%2<<" ";
    return 0;
}