Cod sursa(job #2003248)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 22 iulie 2017 14:45:45
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define Nmax 200010
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
list <int> G[Nmax];
list <int> Gt[Nmax];
int ord[Nmax];
int n,N;
bool ok=true;
bitset <Nmax> viz;
bool sol[Nmax];
int non(const int &x)
{
    if(x<=n) return x+n;
    else return x-n;
}
inline void add_edge(const int &x,const int &y)
{
    G[x].push_back(y);
    Gt[y].push_back(x);
}
void DFS(const int &x)
{
    list <int> :: iterator it;
    viz[x]=true;
    for(it=G[x].begin();it!=G[x].end();it++)
        if(!viz[*it]) DFS(*it);
    ord[++N]=x;
}
void DFFS(const int &x)
{
    list <int> :: iterator it;
    if(sol[x]) ok=false;
    viz[x]=sol[x]=false;
    sol[non(x)]=1;
    for(it=Gt[x].begin();it!=Gt[x].end();it++)
        if(viz[*it]) DFFS(*it);
}
int main()
{
    int m,i,j,k;
    f>>n>>m;
    for(k=1;k<=m;k++)
    {
        f>>i>>j;
        if(i<0) i=n-i;
        if(j<0) j=n-j;
        add_edge(non(i),j);
        add_edge(non(j),i);
    }
    for(i=1;i<=2*n;i++)
        if(!viz[i])
            DFS(i);
    for(i=N;i;i--)
        if(viz[ord[i]] and viz[non(ord[i])])
            DFFS(ord[i]);
    if(!ok)
    {
        g<<-1;
        return 0;
    }
    for(i=1;i<=n;i++)
        g<<sol[i]<<' ';

    return 0;
}