Pagini recente » Cod sursa (job #228356) | Cod sursa (job #533097) | Cod sursa (job #2370254) | Cod sursa (job #684586) | Cod sursa (job #2645407)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
int x, y, nx, ny, n, m, k, c[2*Nmax], o[2*Nmax], viz[2*Nmax], s[Nmax];
vector <int> v[2*Nmax], vt[2*Nmax];
int cazi(int &x, int &nx)
{
if(x<0)
{
nx=-x;
x=-x+n;
}
else nx=x+n;
}
void dfs1(int x)
{
viz[x]=1;
for(auto it:v[x])
if(!viz[it])
dfs1(it);
o[++k]=x;
}
void dfs2(int x)
{
c[x]=k;
for(auto it:vt[x])
if(!c[it])
dfs2(it);
}
int main()
{
fin >> n >> m;
for(int i=1;i<=m;i++)
{
fin >> x >> y;
cazi(x, nx);
cazi(y, ny);
v[ny].push_back(x); vt[x].push_back(ny);
v[nx].push_back(y); vt[y].push_back(nx);
}
for(int i=1;i<=2*n;i++)
if(!viz[i])
dfs1(i);
k=0;
for(int i=2*n;i>=1;i--)
if(!c[o[i]])
{
k++;
dfs2(o[i]);
}
for(int i=1;i<=n;i++)
if(c[i]==c[i+n])
{
fout << -1;
return 0;
}
else s[i] = c[i] > c[i+n];
for(int i=1;i<=n;i++)
fout << s[i] << ' ';
return 0;
}