Cod sursa(job #1373415)

Utilizator IonSebastianIon Sebastian IonSebastian Data 4 martie 2015 18:31:02
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>

using namespace std;

const int MAX_N = 100000, MAX_M = 200000;

FILE *in, *out;

struct graph {
    int lst[2*MAX_N+1], urm[2*MAX_M+1], vf[2*MAX_M+1];
    int nr;
    void add(int x, int y)
    {
        nr++;
        urm[nr] = lst[x];
        vf[nr] = y;
        lst[x] = nr;
    }
};

graph G, GTrans;

int n, m;

bool sol[2*MAX_N+1];

int neg(int x)
{
    return (x > n) ? x-n:x+n;
}

int st[2*MAX_N+1];
int nst;

bool viz[2*MAX_N+1];

void dfs1(int nod)
{
    viz[nod] = true;
    int p = G.lst[nod];
    while(p != 0)
    {
        if(!viz[G.vf[p]])
            dfs1(G.vf[p]);
        p = G.urm[p];
    }
    st[++nst] = nod;
}

void dfs2(int nod)
{
    viz[nod] = false;
    viz[neg(nod)] = false;
    int p = GTrans.lst[nod];
    sol[neg(nod)] = true;
    while(p != 0)
    {
        if(viz[GTrans.vf[p]])
            dfs2(GTrans.vf[p]);
        p = GTrans.urm[p];
    }
}

int main()
{
    in = fopen("2sat.in", "r");
    out = fopen("2sat.out", "w");
    fscanf(in, "%d%d", &n, &m);
    int x, y;
    int i;
    for(int i = 0; i < m; i++)
    {
        fscanf(in, "%d%d", &x, &y);
        if(x < 0) x = neg(-x);
        if(y < 0) y = neg(-y);
        G.add(neg(x), y);
        GTrans.add(y, neg(x));
        G.add(neg(y), x);
        GTrans.add(x, neg(y));
    }
    for(i = 1; i <= 2*n; i++)
        if(!viz[i])
            dfs1(i);
    while(nst != 0)
    {
        if(!viz[st[nst]] && !viz[neg(st[nst])])
        {
            fprintf(out, "-1");
            return 0;
        }
        if(viz[st[nst]] && viz[neg(st[nst])])
            dfs2(st[nst]);
        nst--;
    }
    for(i = 1; i <= n; i++)
        fprintf(out, "%d ", sol[i]);
    fclose(in);
    fclose(out);
    return 0;
}