Pagini recente » Cod sursa (job #3190097) | Cod sursa (job #2312621) | oni2011-uh | Cod sursa (job #545402) | Cod sursa (job #588952)
Cod sursa(job #588952)
#include <stdio.h>
#include <vector>
using namespace std;
int q[200001],val[100001],st[200001],dim[200001],n,m,idx[200001],low[200001],index,i,x,y,luat[200001],gr[200001],ctc[200001];
vector <int> G[200001],scc;
vector < vector <int> > sccs;
inline int non(int a)
{
if (a>0) return a+n;
else return ((-1)*a);
}
inline int abs(int a)
{
if (a>0) return a;
else return ((-1)*a+n);
}
int caut(int vf)
{
idx[vf]=index;
low[vf]=index;
st[++st[0]]=vf;
luat[vf]=1;
index++;
int a;
for (a=0;a<dim[vf];a++)
{
if (luat[G[vf][a]])
{
if (low[G[vf][a]]<low[vf]) low[vf]=low[G[vf][a]];
}
else if (idx[G[vf][a]]<0) {caut(G[vf][a]); if (low[G[vf][a]]<low[vf]) low[vf]=low[G[vf][a]];}
}
if (idx[vf]==low[vf])
{
ctc[0]++;
scc.clear();
do
{
ctc[st[st[0]]]=ctc[0];
scc.push_back(st[st[0]]);
luat[st[st[0]]]=0;
st[0]--;
}while (st[st[0]+1]!=vf);
sccs.push_back(scc);
}
return 0;
}
int main(void)
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
G[non(x)].push_back(abs(y));
G[non(y)].push_back(abs(x));
}
for (i=1;i<=2*n;i++)
{
val[i]=-1;
idx[i]=-1;
low[i]=-1;
dim[i]=G[i].size();
ctc[i]=0;
}
index=1;
for (i=1;i<=2*n;i++)
if (!ctc[i]) caut(i);
int ok=1;
for (i=1;i<=n && ok;i++)
if (ctc[i]==ctc[n+i]) ok=0;
if (!ok) {printf("-1\n"); return 0;}
for (i=1;i<=2*n;i++)
{
for (int j=0;j<dim[i];j++)
if (ctc[G[i][j]]!=ctc[i]) gr[ctc[G[i][j]]]++;
}
for (i=1;i<=ctc[0];i++)
if (gr[i]==0) q[++q[0]]=i;
i=1;
while (i<=q[0])
{
q[i]--;
int l=sccs[q[i]].size();
for (int j=0;j<l;j++)
{
int x=sccs[q[i]][j];
if (x>n) x-=n;
if (val[x]==-1)
if (sccs[q[i]][j]<=n) val[x]=0; else val[x]=1;
for (int k=0;k<dim[sccs[q[i]][j]];k++)
{
gr[ctc[G[sccs[q[i]][j]][k]]]--;
if (gr[ctc[G[sccs[q[i]][j]][k]]]==0) q[++q[0]]=ctc[G[sccs[q[i]][j]][k]];}
}
i++;
}
for (i=1;i<=n;i++)
printf("%d ",val[i]);
printf("\n");
return 0;
}