Pagini recente » Cod sursa (job #725323) | Cod sursa (job #1646934) | Cod sursa (job #2723163) | Cod sursa (job #916581) | Cod sursa (job #2530391)
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#define dim 100001
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m,i,j,lvl,x,sol;
int niv[2*dim],low[2*dim],w[2*dim];
bitset <2*dim> f,r;
deque <int> q;
vector <int> l[2*dim];
void dfs(int nod){
lvl++;
niv[nod]=lvl;
low[nod]=lvl;
q.push_back(nod);
f[nod]=1;
for(int i=0;i<l[nod].size();i++){
int vec=l[nod][i];
if(niv[vec]==0){
dfs(vec);
low[nod]=min(low[nod],low[vec]);
}else
if(f[vec])
low[nod]=min(low[nod],niv[vec]);
}
if(low[nod]==niv[nod]){
r.reset();
do{
x=q.back();
q.pop_back();
f[x]=0;
if((x<=n && r[x+n]) || (x>n && r[x-n]))
sol=-1;
r[x]=1;
if(w[x]==0){
w[x]=1;
if(x<=n)
w[x+n]=-1;
else
w[x-n]=-1;
}
}while(x!=nod);
}
}
int main(){
fin>>n>>m;
for(;m;m--){
fin>>i>>j;
if(i>0){
if(j>0){
l[i+n].push_back(j);
l[j+n].push_back(i);
}else{
l[i+n].push_back(-j+n);
l[-j].push_back(i);
}
}else{
if(j>0){
l[-i].push_back(j);
l[j+n].push_back(-i+n);
}else{
l[-i].push_back(-j+n);
l[-j].push_back(-i+n);
}
}
}
for(i=1;i<=2*n;i++)
if(w[i]==0)
dfs(i);
if(sol==-1)
fout<<"-1";
else
for(i=1;i<=n;i++)
fout<<min(w[i]+1,1)<<" ";
return 0;
}