Cod sursa(job #2156352)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 8 martie 2018 17:52:55
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int n,m,x,y,tip,cur=1,viz[200003];
vector <int> Sol,O,G[200003],Q[200003];
void add(int x,int y)
{
    G[x].push_back(y);
    Q[y].push_back(x);
}
void dfs(int x)
{
    viz[x]=1;
    for(int i=0;i<(int)G[x].size();++i)
        if(!viz[G[x][i]]) dfs(G[x][i]);
    O.push_back(x);
}
int negat(int x)
{
    if(x<=n) return x+n;
    return x-n;
}
void DFS(int x)
{
    viz[x]=cur;
    for(int i=0;i<(int)Q[x].size();++i)
        if(viz[Q[x][i]]==1) DFS(Q[x][i]);
}
int main()
{
    f>>n>>m;
    while(m--)
    {
        f>>x>>y;
        if(x<0) x=n-x;
        if(y<0) y=n-y;
        add(negat(x),y);
        add(negat(y),x);
    }
    for(int i=1;i<=2*n;++i)
        if(!viz[i]) dfs(i);
    for(int i=O.size()-1;i>=0;--i)
        if(viz[O[i]]==1)
        {
            cur++;
            DFS(O[i]);
        }
    for(int i=1;i<=n;++i)
        if(viz[i]==viz[i+n])
    {
        g<<-1;
        return 0;
    }
    for(int i=1;i<=n;++i)
        if(viz[i]<viz[i+n]) g<<"0 ";
        else g<<"1 ";
    return 0;
}