Pagini recente » Cod sursa (job #2198853) | Cod sursa (job #186960) | Cod sursa (job #1824271) | Cod sursa (job #1210112) | Cod sursa (job #1374993)
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=100000;
vector<int>g[2*N+1];
vector<int>h[2*N+1];
int q[2*N+1];
int st[4*N+1];
bool vis[2*N+1];
int repr[2*N+1];
bool stacked[2*N+1];
int whose[2*N+1];
bool colour[2*N+1];
int n,m;
int nctc;
int top;
int inv(int x){
if(x>n)
return x-n;
return x+n;
}
void dfs(int dad){
vis[dad]=true;
for(unsigned int i=0;i<g[dad].size();i++){
int son=g[dad][i];
if(!vis[son])
dfs(son);
}
st[++top]=dad;
stacked[dad]=true;
}
void bfs(int node){
int l=1,r=1;
q[1]=node;
whose[node]=nctc;
repr[nctc]=node;
stacked[node]=false;
while(l<=r){
int dad=q[l++];
for(unsigned int i=0;i<h[dad].size();i++){
int son=h[dad][i];
if(stacked[son]){
q[++r]=son;
whose[son]=nctc;
stacked[son]=false;
}
}
}
}
int main(){
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x<0)
x=-x+n;
if(y<0)
y=-y+n;
g[inv(x)].push_back(y);
g[inv(y)].push_back(x);
h[y].push_back(inv(x));
h[x].push_back(inv(y));
}
for(int i=1;i<=2*n;i++)
if(!vis[i])
dfs(i);
memset(vis,0,sizeof(vis));
while(top){
if(stacked[st[top]]){
nctc++;
bfs(st[top]);
}
top--;
}
for(int i=1;i<=n;i++)
if(whose[i]==whose[n+i]){
printf("-1");
return 0;
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=nctc;i++)
if(!vis[i]&&!vis[whose[inv(repr[i])]]){
colour[whose[inv(repr[i])]]=true;
vis[i]=true;
vis[whose[inv(repr[i])]]=true;
}
for(int i=1;i<=n;i++)
if(colour[whose[i]])
printf("1 ");
else
printf("0 ");
return 0;
}