Cod sursa(job #1687562)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 12 aprilie 2016 22:15:15
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100000;
const int MAX_M = 200000;
const int NIL = -1;
const int BUFFSIZE = 582257;

char buf[BUFFSIZE];
int pos = BUFFSIZE;

inline char getChar() {
    if (pos == BUFFSIZE) {
        fread(buf, 1, BUFFSIZE, stdin);
        pos = 0;
    }
    return buf[pos++];
}

inline int readInt() {
    int q = 0;
    char c; bool sign = 0;
    do {
        c = getChar();
        sign |= (c == '-');
    } while (!isdigit(c));
    do {
        q = (q << 1) + (q << 3) + (c - '0');
        c = getChar();
    } while (isdigit(c));
    return (q ^ ((q ^ -q) & -sign));
}

struct List {
    int v;
    int next;
};

List buff[2 * MAX_M];
int head[2 * MAX_N];

bool onStack[2 * MAX_N];
int st[2 * MAX_N], vf;
int ptr[2 * MAX_N], freePtr;

List CTC[2 * MAX_N];
int ctcHead[2 * MAX_N];
int numCTC, ctcPtr;

bool attribute[2 * MAX_N];

void addArc(int u, int v, int pos) {
    buff[pos].v = v;
    buff[pos].next = head[u];
    head[u] = pos;
}

int tarjan(int u) {
    onStack[u] = true;
    st[vf++] = u;
    int minPtr = ptr[u] = freePtr++;

    for (int i = head[u]; i != NIL; i = buff[i].next) {
        int v = buff[i].v;
        if (ptr[v] == NIL) {
            minPtr = min(minPtr, tarjan(v));
        } else if (onStack[v]) {
            minPtr = min(minPtr, ptr[v]);
        }
    }

    if (ptr[u] == minPtr) {
        int v;
        ctcHead[numCTC] = NIL;
        do {
            v = st[--vf];
            onStack[v] = false;
            CTC[ctcPtr].v = v;
            CTC[ctcPtr].next = ctcHead[numCTC];
            ctcHead[numCTC] = ctcPtr++;
        } while (v != u);
        ++ numCTC;
    }
    return minPtr;
}

int main() {
    assert(freopen("2sat.in", "r", stdin));
    assert(freopen("2sat.out", "w", stdout));

    int n = readInt(), m = readInt();

    memset(head, NIL, 4 * 2 * n);
    memset(ptr, NIL, 4 * 2 * n);

    for (int i = 0; i < m; ++ i) {
        int u = readInt(), v = readInt();
        u = ((u ^ ((u ^ -u) & -(u < 0))) << 1) - 1 - (u > 0);
        v = ((v ^ ((v ^ -v) & -(v < 0))) << 1) - 1 - (v > 0);
        addArc(u ^ 1, v, 2 * i);
        addArc(v ^ 1, u, 2 * i + 1);
    }
    fclose(stdin);

    for (int i = 0; i < (n << 1); ++ i) {
        if (ptr[i] == NIL) {
            tarjan(i);
        }
    }

    for (int i = numCTC - 1; i >= 0; -- i)
        if (!attribute[CTC[ctcHead[i]].v])
            for (int j = ctcHead[i]; j != NIL; j = CTC[j].next)
                attribute[CTC[j].v ^ 1] = 1;

    int i = 0;
    while (i < n && (attribute[i << 1] || attribute[(i << 1) | 1])) {
        ++ i;
    }
    if (i != n) {
        puts("-1");
    } else {
        for (int i = 0; i < n; ++ i) {
            putchar(attribute[i << 1] + '0');
            putchar(' ');
        }
        putchar('\n');
    }
    fclose(stdout);

    return 0;
}