Cod sursa(job #1750934)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 31 august 2016 14:44:45
Problema 2SAT Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
# include <fstream>
# include <vector>
# include <algorithm>
# define DIM 200010
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector <int> Lista[DIM],ctc[DIM];
int Marcat[DIM],s[DIM],poz[DIM],low[DIM],val[DIM],vec[DIM];
int n,m,x,y,u,nr,nctc,i,j,ok,loc,k;
int vall(int x){
    if(x>0)
        return x;
    else
        return n-x;
}
int pf(int x){
    if(x>n)
        return x-n;
    else
        return x;
}
int sw(int x){
    if(x>n)
        return x-n;
    else
        return x+n;
}
void tarjan(int nc){
    nr++;
    poz[nc]=nr;
    low[nc]=nr;
    s[++u]=nc;
    Marcat[nc]=1;
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i];
        if(poz[nv]){
            if(Marcat[nv])
                low[nc]=min(low[nc],low[nv]);
        }
        else{
            tarjan(nv);
            low[nc]=min(low[nc],low[nv]);
        }
    }
    if(low[nc]==poz[nc]){
        nctc++;
        ok=1;
        while(s[u]!=nc){
            if(val[s[u]]+1){
                ok=0;
                loc=val[s[u]];
            }
            ctc[nctc].push_back(s[u]);
            Marcat[s[u]]=0;
            u--;
        }
        if(val[nc]+1){
            ok=0;
            loc=val[nc];
        }
        if(ok){
            val[nc]=1;
            loc=1;
        }
        val[sw(nc)]=1-loc;
        ctc[nctc].push_back(nc);
        Marcat[nc]=0;
        u--;
    }
}int main () {
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        x=vall(x);
        y=vall(y);
        Lista[sw(x)].push_back(y);
        Lista[sw(y)].push_back(x);
    }
    for(i=1;i<=2*n;i++)
        val[i]=-1;
    for(i=1;i<=2*n;i++)
        if(!poz[i])
            tarjan(i);
    ok=1;
    for(i=1;i<=nctc;i++)
        for(j=ctc[i].size()-2;j>=0;j--)
            val[ctc[i][j]]=val[ctc[i][j+1]];
    for(i=1;i<=nctc;i++){
        k=0;
        for(j=ctc[i].size()-1;j>=0;j--)
            vec[++k]=pf(ctc[i][j]);
        sort(vec+1,vec+k+1);
        for(j=0;j<ctc[i].size();j++)
            ctc[i][j]=vec[j+1];
        for(j=1;j<ctc[i].size();j++)
            if(ctc[i][j]==ctc[i][j-1])
                ok=0;
    }
    if(ok)
        for(i=1;i<=n;i++)
            fout<<val[i]<<" ";
    else
        fout<<-1;
    fout<<"\n";
    return 0;
}