Cod sursa(job #2416338)

Utilizator akaprosAna Kapros akapros Data 27 aprilie 2019 13:40:50
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define maxN 200002

using namespace std;

FILE *fin = freopen("2sat.in", "r", stdin);
FILE *fout = freopen("2sat.out", "w", stdout);

int n, m;
vector < int > V[2][maxN];

int ts[maxN];
bool vis[maxN];

bool ans[maxN];

void NoSol()
{
    printf("-1");
    exit(0);
}
int Not(int u)
{
    if (u < n) return u + n;
    return u - n;
}
void dfs(int ty, int u)
{
    vis[u] = !ty;
    if (ty && ans[u])
        NoSol();
    if (ty)
    {
        ans[u] = false;
        ans[Not(u)] = true;
    }
    for (int v : V[ty][u])
        if (vis[v] == ty)
            dfs(ty, v);
    if (!ty)
        ts[++ ts[0]] = u;
}
void AddEdge(int u, int v)
{
    V[0][Not(u)].push_back(v);
    V[1][v].push_back(Not(u));
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        if (u < 0) u = Not(-u - 1);
        else -- u;
        if (v < 0) v = Not(-v - 1);
        else -- v;
        AddEdge(u, v);
        AddEdge(v, u);
    }
    for (int i = 0; i < 2 * n; ++ i) if (!vis[i]) dfs(0, i);
    for (int i = 2 * n; i > 0; -- i) if (vis[ts[i]] && vis[Not(ts[i])])
            dfs(1, ts[i]);
    for (int i = 0; i < n; ++ i) printf("%d ", ans[i]);
    return 0;
}