Pagini recente » Cod sursa (job #1235986) | Cod sursa (job #616777) | Cod sursa (job #929776) | Cod sursa (job #1372581) | Cod sursa (job #1966667)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2 * 1e5 + 9;
int n, m, comp_id, komp[MAX_N];
bool viz[MAX_N];
vector<int>g[MAX_N], gt[MAX_N];
vector<int>ord;
int non(int x)
{
return x ^ 1;
}
int get(int x)
{
return x < 0 ? -2 * x : 2 * x + 1;
}
void Read()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
int a, b;
scanf("%d%d", &a, &b);
a = get (a), b = get (b);
g[non(a)].push_back(b);
g[non(b)].push_back(a);
gt[b].push_back(non(a));
gt[a].push_back(non(b));
}
}
void Dfs1(int nod)
{
viz[nod] = 1;
for (auto i : g[nod])
if (!viz[i])Dfs1(i);
ord.push_back(nod);
}
void Dfs2(int nod)
{
komp[nod] = comp_id;
viz[nod] = 1;
for (auto i : gt[nod])
if (!viz[i])Dfs2(i);
}
void TareKonexe()
{
for (int i = 1; i <= 2 * n; ++i)
if (!viz[i])Dfs1(i);
memset(viz, 0, sizeof viz);
while (!ord.empty())
{
int nod = ord.back();
ord.pop_back();
if (!viz[nod])
{
++comp_id;
Dfs2(nod);
}
}
}
void Solve()
{
for (int i = -n; i <= n; ++i)
if (i != 0 && komp[get(i)] == komp[get(i) ^ 1])
{
printf("%d", -1);
return;
}
for (int i = 1;i<=n;++i)
if (komp[2 * i] > komp[2 * i - 1])printf("%d ", 1);
else printf("%d ", 0);
}
int main()
{
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
Read();
TareKonexe();
Solve();
}