Cod sursa(job #1909584)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 7 martie 2017 13:12:02
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
using namespace std;

vector <int> adia[200010], adia_back[200010];
vector <int> sortop;
bool viz[200010], mere(1);
int n;
int ans[200010];

int inv(int nod);
void dfs(int nod);
void dfs_back(int nod);


int main()
{
    ifstream in("2sat.in");
    ofstream out("2sat.out");
    int m, a, b;
    in >> n >> m;

    while (m--) {
        in >> a >> b;
        if (a < 0)
            a = n - a;
        if (b < 0)
            b = n - b;
        adia[inv(a)].push_back(b);
        adia[inv(b)].push_back(a);
        adia_back[a].push_back(inv(b));
        adia_back[b].push_back(inv(a));
    }

    for (int i(1); i <= 2 * n; i++)
        if (!viz[i])
            dfs(i);

    for (reverse_iterator <vector <int> :: iterator> it(sortop.rbegin()); it != sortop.rend(); it++)
        if (viz[*it] && viz[inv(*it)])
            dfs_back(*it);

    if (!mere) {
        out << -1;
        return 0;
    }

    for (int i(1); i <= n; i++)
        out << ans[i] << ' ';
    return 0;
}

void dfs_back(int nod)
{
    if (ans[nod] == 1)
        mere = 0;
    viz[nod] = 0;
    ans[nod] = 0;
    ans[inv(nod)] = 1;
    for (auto i : adia_back[nod]) {
        if (viz[i])
            dfs_back(i);
    }
}

void dfs(int nod)
{
    viz[nod] = 1;
    for (auto i : adia[nod]) {
        if (!viz[i])
            dfs(i);
    }
    sortop.push_back(nod);
}

int inv(int nod)
{
    if (nod <= n)
        return n + nod;
    return nod - n;
}