Pagini recente » Cod sursa (job #1331268) | Cod sursa (job #2454590) | Cod sursa (job #2939953) | Cod sursa (job #1572439) | Cod sursa (job #1247208)
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 200010
using namespace std;
vector<int>v[N],c,s;
vector<vector<int>>C;
int n,m,x,y,X,Y,i,j,viz[N],back[N],nc,Comp[N],Val[N],k;
void df(int);
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d",&x,&y);
if(x<0)x=n-x;
if(y<0)y=n-y;
X=x>n?x-n:x+n;
Y=y>n?y-n:y+n;
v[X].push_back(y);
v[Y].push_back(x);
}
for(i=1;i<=2*n;i++)
if(!viz[i])
df(i);
for(i=1;i<=n;i++)
if(Comp[i]==Comp[i+n])
{
printf("-1");
return 0;
}
for(i=nc-1;i>=1;i--)
{
if(!C[i].size())continue;
x=C[i].front();
X=x>n?x-n:x+n;
j=Comp[X];
for(auto it:C[j])
Val[it]=1;
C[j].resize(0);
}
for(i=1;i<=n;i++)
printf("%d ",Val[i]);
return 0;
}
void df(int nod)
{
viz[nod]=++k;
back[nod]=k;
s.push_back(nod);
for(auto vec:v[nod])
{
if(!viz[vec])
df(vec);
if(viz[vec]>0)
back[nod]=min(back[nod],back[vec]);
}
if(viz[nod]==back[nod])
{
c.resize(0);
do
{
c.push_back(s.back());
viz[s.back()]=-1;
Comp[s.back()]=nc;
s.pop_back();
}
while(c.back()!=nod);
C.push_back(c);
nc++;
}
}