Pagini recente » Cod sursa (job #1220926) | Cod sursa (job #2215977) | Cod sursa (job #3174341) | Cod sursa (job #1234425) | Cod sursa (job #2187406)
#include<bits/stdc++.h>
#define maxN 200005
using namespace std;
vector<int> ctc;
vector<int> v[maxN];
int n,sol[maxN];
bool id[maxN];
inline void Fail()
{
printf("-1\n");
exit(0);
}
inline int neg(int x)
{
if(x>n) return x-n;
else return x+n;
}
inline void solve()
{
for(auto it:ctc)
{
id[it]=1;
if(id[neg(it)]) Fail();
}
int val=-1;
for(auto it:ctc)
{
if(sol[it]!=-1)
{
val=sol[it];
break;
}
}
for(auto it:ctc)
{
if(val==-1) sol[it]=-1;
else sol[it]=0;
sol[neg(it)]=1^sol[it];
id[it]=0;
}
}
int low[maxN],niv[maxN],lvl,st[maxN],vf;
bool inStack[maxN],seen[maxN];
inline void dfs(int nod)
{
low[nod]=niv[nod]=++lvl;
st[++vf]=nod;
inStack[nod]=1;
for(auto it:v[nod])
{
if(!niv[it])
{
dfs(it);
low[nod]=min(low[nod],low[it]);
}
else
if(inStack[it])
{
low[nod]=min(low[nod],low[it]);
}
}
if(low[nod]==niv[nod])
{
int x;
do
{
x=st[vf];
ctc.push_back(x);
vf--;
inStack[x]=0;
}while(x!=nod);
solve();
ctc.clear();
}
}
int m,x,y;
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x<0) x=n-x;
if(y<0) y=n-y;
v[neg(x)].push_back(y);
v[neg(y)].push_back(x);
}
for(int i=1;i<=2*n;i++)
sol[i]=-1;
for(int i=1;i<=2*n;i++)
if(!niv[i]) dfs(i);
for(int i=1;i<=n;i++)
printf("%d ",sol[i]);
printf("\n");
return 0;
}