Pagini recente » Cod sursa (job #1138490) | Cod sursa (job #1825415) | Cod sursa (job #1767995) | Cod sursa (job #261334) | Cod sursa (job #2702399)
#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);
}