Pagini recente » Cod sursa (job #2248588) | Cod sursa (job #2999795) | Cod sursa (job #318728) | Cod sursa (job #2838120) | Cod sursa (job #2286164)
#include<cstdio>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
vector<int>g[200001],c[200001],v;
stack<int>st;
int disc[200001],low[200001],n,val,nrc,cc[200001],sol[100001],found[200001];
bool ins[200001];
int negare(int x,int n)
{
if(x>n)
return x-n;
return x+n;
}
void scc(int x)
{
val++;
disc[x]=val;
low[x]=val;
st.push(x);
ins[x]=1;
int i,u;
for(i=0;i<(int)g[x].size();++i)
{
if(!disc[g[x][i]])
{
scc(g[x][i]);
low[x]=min(low[x],low[g[x][i]]);
}
else
{
if(ins[g[x][i]])
low[x]=min(low[x],low[g[x][i]]);
}
}
if(disc[x]==low[x])
{
v.clear();
do
{
u=st.top();
v.push_back(u);
ins[u]=0;
st.pop();
}while(u!=x);
nrc++;
for(i=0;i<(int)v.size();++i)
{
c[nrc].push_back(v[i]);
cc[v[i]]=nrc;
}
}
}
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
int m,i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
if(x<0)
x=n-x;
if(y<0)
y=n-y;
g[negare(x,n)].push_back(y);
g[negare(y,n)].push_back(x);
}
for(i=1;i<=2*n;++i)
{
if(!disc[i])
scc(i);
}
bool ok=1;
for(i=1;i<=n;++i)
{
if(cc[i]==cc[i+n])
{
printf("-1\n");
ok=0;
break;
}
}
if(ok)
{
for(i=nrc;i;--i)
{
for(j=0;j<(int)c[i].size();++j)
{
if((c[i][j]<=n&&found[c[i][j]])||(c[i][j]>n&&found[c[i][j]-n]))
break;
if(c[i][j]>n)
{
found[c[i][j]-n]=1;
sol[c[i][j]-n]=1;
}
else
found[c[i][j]]=1;
}
}
for(i=1;i<=n;++i)
{
printf("%d ",sol[i]);
}
}
return 0;
}