Cod sursa(job #2168617)

Utilizator Bodo171Bogdan Pop Bodo171 Data 14 martie 2018 11:44:58
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=200005;
vector<int> v[nmax],vt[nmax];
int ans[nmax],viz[nmax],r[nmax],c[nmax];
int n,m,i,j,nr,x,y;
inline int no(int x)
{
    if(x>n) return x-n;
    return x+n;
}
void add(int A,int B)
{
    v[A].push_back(B);
    vt[B].push_back(A);
}
void dfs1(int x)
{
    viz[x]=1;
    for(int i=0;i<v[x].size();i++)
      if(!viz[v[x][i]])
        dfs1(v[x][i]);
    r[++nr]=x;
}
void dfs2(int x)
{
    viz[x]=0;ans[x]=0;ans[no(x)]=1;c[x]=nr;
    for(int i=0;i<vt[x].size();i++)
        if(viz[vt[x][i]])
           dfs2(vt[x][i]);
}
int main()
{
    ifstream f("2sat.in");
    ofstream g("2sat.out");
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        if(x<0) x=n-x;
        if(y<0) y=n-y;
        add(no(x),y);
        add(no(y),x);
    }
    for(i=1;i<=2*n;i++)
       if(!viz[i])
         dfs1(i);
    nr=0;
    for(i=2*n;i>=1;i--)
        if(viz[r[i]]&&(!ans[r[i]]))
          {
              ++nr;
              dfs2(r[i]);
          }
    for(i=1;i<=n;i++)
        if(c[i]==c[n+i])
    {
        g<<"-1";
        return 0;
    }
    for(i=1;i<=n;i++)
        g<<ans[i]<<' ';
    return 0;
}