Cod sursa(job #1254544)

Utilizator geniucosOncescu Costin geniucos Data 2 noiembrie 2014 21:34:42
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<cstdio>
#include<vector>

using namespace std;

int M;

class SAT
{
    public:
    int n_Q, N, ap[200009], sol[100009], Q[200009];
    vector < int > v[200009], h[200009];
    int cod (int X)
    {
        if (X>=0) return X;
        return N - X;
    }

    int opus (int X)
    {
        if (X<=N) return N + X;
        return X - N;
    }

    void Add_Implication (int X, int Y)
    {
        v[cod(X)].push_back(cod(Y));
        h[cod(Y)].push_back(cod(X));
    }

    void Add_Clauza (int X, int Y)
    {
        Add_Implication (-X, Y);
        Add_Implication (-Y, X);
    }

    void dfs (int nod)
    {
        ap[nod] = 1;
        for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
            if (ap[*it] == 0)
                dfs (*it);
        Q[++n_Q] = nod;
    }

    void dfp (int nod)
    {
        sol[opus (nod)] = 1;
        ap[nod] = 0;
        for (vector < int > :: iterator it = h[nod].begin(); it != h[nod].end(); it++)
            if (ap[*it] == 1)
                dfp (*it);
    }

    void solve ()
    {
        for (int i=1; i<=N; i++)
            if (ap[i] == 0)
                dfs (i);

        for (int i=n_Q; i>=1; i--)
            if (ap[Q[i]] && ap[opus(Q[i])])
                dfp (i);
    }
}sistem;

int main()
{
freopen ("andrei.in", "r", stdin);
freopen ("andrei.out", "w", stdout);
scanf ("%d %d", &sistem.N, &M);
for (int i=1; i<=M; i++)
{
    int A, B, C;
    scanf ("%d %d %d", &A, &B, &C);
    if (C == 0) sistem.Add_Clauza (A, B);
    else
    if (C == 1) sistem.Add_Clauza (-A, -B);
    else
    {
        sistem.Add_Clauza (-A, B);
        sistem.Add_Clauza (-B, A);
    }
}

sistem.solve();

for (int i=1; i<=sistem.N; i++)
    printf ("%d ", sistem.sol[i]);
printf ("\n");

return 0;
}