Pagini recente » Cod sursa (job #2956494) | Cod sursa (job #1216982) | Cod sursa (job #669516) | Cod sursa (job #890187) | Cod sursa (job #1215450)
#include<cstdio>
#include<vector>
#include<stack>
#include<set>
#include<bitset>
using namespace std;
bitset<200100>v,x;
set<int>s;
stack<int>c;
vector<int>L[200100];
int n,m,i,j,a,b,niv[200100],low[200100],z[200100],y[200100],ok;
FILE *f,*g;
int minim(int a,int b){
if(a<b)
return a;
return b;
}
void dfs(int nod){
int i;
a++;
v[nod]=1;
x[nod]=1;
c.push(nod);
low[nod]=a;
niv[nod]=a;
for(i=0;i<L[nod].size();i++){
b=L[nod][i];
if(!v[b]){
dfs(b);
low[nod]=minim(low[nod],low[b]);
}
else if(x[b])
low[nod]=minim(low[nod],low[b]);
}
if(low[nod]==niv[nod]){
s.clear();
do{
b=c.top();
c.pop();
x[b]=0;
if((b<=n&&s.find(b+n)!=s.end())||(b>n&&s.end()!=s.find(b-n)))
ok=-1;
s.insert(b);
if(y[b]==0){
y[b]=1;
if(b<=n)
y[b+n]=-1;
else
y[b-n]=-1;
}
}while(b!=nod);
}
}
int main(){
f=fopen("2sat.in","r");
g=fopen("2sat.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=m;i++){
fscanf(f,"%d%d",&a,&b);
if(a>0){
if(b>0){
L[a+n].push_back(b);
L[b+n].push_back(a);
}
else{
L[a+n].push_back(-b+n);
L[a].push_back(-b);
}
}
else{
if(b>0){
L[-a].push_back(b);
L[-a+n].push_back(b+n);
}
else{
L[-a].push_back(-b+n);
L[-b].push_back(-a+n);
}
}
}
a=0;
for(i=1;i<=2*n;i++){
if(!v[i])
dfs(i);
}
if(ok){
fprintf(g,"-1");
return 0;
}
for(i=1;i<=n;i++){
if(y[i]==1)
fprintf(g,"1 ");
else
fprintf(g,"0 ");
}
fclose(f);
fclose(g);
return 0;
}