Pagini recente » Cod sursa (job #1999021) | Cod sursa (job #1311746) | Cod sursa (job #2704598) | Cod sursa (job #1111542) | Cod sursa (job #384536)
Cod sursa(job #384536)
#include<stdio.h>
#include<vector>
#include<string.h>
#define nmax 2005
using namespace std;
int n,m,st[nmax],viz[nmax],sol[nmax];
vector<int> v[nmax],vt[nmax];
inline int neg(int x){return x>n?x-n:x+n;}
void dfs(int x)
{
int i,lim=v[x].size();
viz[x]=1;
for(i=0;i<lim;i++)
if(!viz[v[x][i]])
dfs(v[x][i]);
st[++st[0]]=x;
}
void dfs2(int x)
{
int i,lim=vt[x].size();
viz[x]=1;
sol[neg(x)]=1;
for(i=0;i<lim;i++)
if(!viz[vt[x][i]])
dfs2(vt[x][i]);
}
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
int i,a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(a<0)
a=n+(-a);
if(b<0)
b=n+(-b);
v[neg(a)].push_back(b);
vt[a].push_back(neg(b));
v[neg(b)].push_back(a);
vt[b].push_back(neg(a));
}
for(i=1;i<=2*n;i++)
if(!viz[i])
dfs(i);
memset(viz,0,sizeof(viz));
for(i=2*n;i>=1;i--)
if(!viz[st[i]] && !viz[neg(st[i])])
dfs2(st[i]);
for(i=1;i<=n;i++)
if(sol[i]==sol[neg(i)])
{
printf("-1\n");
return 0;
}
for(i=1;i<=n;i++)
printf("%d ",sol[i]);
return 0;
}