Pagini recente » Cod sursa (job #2591587) | Cod sursa (job #2332192) | Cod sursa (job #1186465) | Cod sursa (job #843154) | Cod sursa (job #2921280)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("2sat.in");
ofstream fout("2sat.out");
const int dim=1e5+9;
struct elem{int x,y;}expr[dim];
vector<int>g[dim],ct[dim];
int n,m;
int ans[dim],aux[dim];
bool verifica_pereche(elem t){
int x=aux[abs(t.x)];
int y=aux[abs(t.y)];
if(t.x<0){
x^=1;
}
if(t.y<0){
y^=1;
}
return x|y;
}
bool vizitat[dim];
bool valid(int t){
queue<int>q;
fill(vizitat+1,vizitat+n+1,false);
vizitat[t]=true;
q.push(t);
while(!q.empty()){
int x=q.front();
for(int i=0;i<g[x].size();i++){
int y=abs(g[x][i]);
int nr=ct[x][i];
if(!vizitat[y]){
int anterior=aux[y];
bool ok=false;
aux[y]=0;
if(!verifica_pereche(expr[nr])){
ok=true;
}
aux[y]=1;
if(!verifica_pereche(expr[nr])){
ok=true;
}
if(ok){
aux[y]=0;
if(!verifica_pereche(expr[nr])){
aux[y]=1;
}
q.push(y);
vizitat[y]=true;
}else{
aux[y]=anterior;
}
}else{
if(!verifica_pereche(expr[nr])){
return false;
}
}
}
q.pop();
}
return true;
}
signed main(){
fin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
fin>>x>>y;
expr[i].x=x,expr[i].y=y;
g[abs(x)].push_back(y);
g[abs(y)].push_back(x);
ct[abs(x)].push_back(i);
ct[abs(y)].push_back(i);
}
fill(ans+1,ans+n+1,-1);
for(int i=1;i<=n;i++){
if(ans[i]==-1){
ans[i]=0;
memcpy(aux,ans,sizeof(ans));
if(!valid(i)){
ans[i]=1;
memcpy(aux,ans,sizeof(ans));
if(!valid(i)){
fout<<-1;
return 0;
}
}
memcpy(ans,aux,sizeof(ans));
}else{
memcpy(aux,ans,sizeof(ans));
if(!valid(i)){
ans[i]^=1;
//memcpy(aux,ans,sizeof(ans));
if(!valid(i)){
fout<<-1;
return 0;
}
}
memcpy(ans,aux,sizeof(ans));
}
}
for(int i=1;i<=n;i++){
fout<<ans[i]<<' ';
}
}