Pagini recente » Cod sursa (job #970297) | Cod sursa (job #2624084) | Cod sursa (job #1806484) | Cod sursa (job #2346807) | Cod sursa (job #2572259)
#include<bits/stdc++.h>
using namespace std;
const int maxN=(2e5)+5;
int n,m,lvl,niv[maxN],low[maxN],st[maxN],vf;
vector<int> v[maxN],C[maxN];
bool inStack[maxN];
inline int f(int x)
{
if(x<0) return n-x;
return x;
}
int ctc,where[maxN];
inline int neg(int x)
{
if(x<=n) return x+n;
return x-n;
}
void dfs(int nod)
{
lvl++;
niv[nod]=low[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=-1;
ctc++;
while(x!=nod)
{
x=st[vf];
where[x]=ctc;
C[ctc].push_back(x);
inStack[x]=0;
vf--;
}
}
}
int x,y,val[maxN];
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);
x=f(x);
y=f(y);
v[x].push_back(neg(y));
v[y].push_back(neg(x));
}
for(int i=1;i<=2*n;i++)
val[i]=-1;
for(int i=1;i<=2*n;i++)
if(!niv[i]) dfs(i);
for(int i=1;i<=ctc;i++)
{
for(auto it:C[i])
if(where[it]==where[neg(it)])
{
printf("-1\n");
exit(0);
}
int w=-1;
for(auto it:C[i])
{
if(val[it]==-1) continue;
if(w==-1) w=val[it];
else
if(w!=val[it])
{
printf("-1\n");
exit(0);
}
}
if(w==-1) w=1;
for(auto it:C[i])
{
val[it]=w;
int x=neg(it);
if(val[x]!=-1 && val[x]!=(1-val[it]))
{
printf("-1\n");
exit(0);
}
val[x]=1-val[it];
}
}
for(int i=1;i<=n;i++)
printf("%d ",val[i]);
return 0;
}