Cod sursa(job #2702399)

Utilizator beingsebiPopa Sebastian beingsebi Data 3 februarie 2021 22:16:08
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int n, comp[200009], sc = 1;
bool bif[200009], af[100009];
stack<int> st;
vector<vector<int>> v, tv;
void add_edge(int, int);
void dfs1(int);
void dfs2(int);
int main()
{
    int m;
    f >> n >> m;
    v.resize(2 * n);
    tv.resize(2 * n);
    for (int x, y; m; m--)
    {
        f >> x >> y;
        if (x < 0)
            x *= -1, x = (x - 1) << 1, x++;
        else
            x = (x - 1) << 1;
        if (y < 0)
            y *= -1, y = (y - 1) << 1, y++;
        else
            y = (y - 1) << 1;
        add_edge(x, y);
    }
    for (int i = 0; i < 2 * n; i++)
        if (!bif[i])
            dfs1(i);
    while (!st.empty())
    {
        int ac = st.top();
        st.pop();
        if (!comp[ac])
            dfs2(ac), sc++;
    }
    for (int i = 0; i < 2 * n; i += 2)
        if (comp[i] == comp[i + 1])
            g << -1, g.flush(), exit(0);
        else
            af[i / 2] = comp[i] > comp[i + 1];
    for (int i = 0; i < n; i++)
        g << af[i] << " ";
    return 0;
}
void add_edge(int x, int y)
{
    v[x ^ 1].emplace_back(y);
    v[y ^ 1].emplace_back(x);
    tv[y].emplace_back(x ^ 1);
    tv[x].emplace_back(y ^ 1);
}
void dfs1(int x)
{
    bif[x] = 1;
    for (const int &i : v[x])
        if (!bif[i])
            dfs1(i);
    st.push(x);
}
void dfs2(int x)
{
    comp[x] = sc;
    for (const int &i : tv[x])
        if (!comp[i])
            dfs2(i);
}