Pagini recente » Cod sursa (job #554655) | Borderou de evaluare (job #1519462) | Cod sursa (job #723855) | Cod sursa (job #554669) | Cod sursa (job #3344934)
#include <bits/stdc++.h>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[200009], vt[200009];
int n;
int ctc[200009];
int cnt=0, lin[200009], curr=0;
bool viz[200009];
int get_nod (int x)
{
if (x<0) return -x+n;
return x;
}
int neg (int x)
{
if (x>n)
return x-n;
return x+n;
}
void add (int x, int y)
{
v[x].push_back(y);
vt[y].push_back(x);
}
void imposibil (int x, int y)
{
add (x, neg(y));
add (y, neg(x));
}
void dfs0 (int nod)
{
viz[nod]=1;
for (auto y:v[nod])
if (!viz[y]) dfs0 (y);
lin[++cnt]=nod;
}
void dfs (int nod)
{
viz[nod]=1;
ctc[nod]=curr;
for (auto y:vt[nod])
if (!viz[y]) dfs (y);
}
signed main ()
{
int m;
f >> n >> m;
while (m--)
{
int x, y;
f >> x >> y;
x=get_nod(x), y=get_nod(y);
imposibil (neg(x), neg(y));
}
for (int i=1; i<=2*n; i++)
if (!viz[i]) dfs0(i);
for (int i=1; i<=2*n; i++)
viz[i]=0;
for (int i=2*n; i>=1; i--)
{
if (!viz[lin[i]])
curr++, dfs (lin[i]);
}
for (int i=1; i<=n; i++)
if (ctc[i]==ctc[i+n])
{
g << -1;
exit(0);
}
for (int i=1; i<=n; i++)
{
if (ctc[i]<ctc[i+n])
g << 0<< ' ';
else g <<"1 ";
}
}