Pagini recente » Cod sursa (job #1723434) | Cod sursa (job #1488676) | Cod sursa (job #1234838) | Cod sursa (job #505944) | Cod sursa (job #2382614)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m,i,tip,k,cul[100010],o[100010];
vector<int> nodes[100010],g[2][100010];
bitset<100010> viz,done,r;
void dfs(int poz)
{
viz[poz]=tip^1;
if(tip)
{
nodes[k].push_back(poz);
cul[poz]=k;
}
for(auto it:g[tip][poz])
if(viz[it]==tip)
dfs(it);
if(!tip)
o[++o[0]]=poz;
}
void go(int poz,int t)
{
done[poz]=1;
r[poz]=t;
for(auto it:nodes[poz])
{
if(!done[cul[it^1]])
go(cul[it^1],t^1);
if(t)
for(auto that:g[0][it])
if(!done[cul[that]])
go(cul[that],1);
}
return ;
}
void inline muchie(int x,int y)
{
g[0][x].push_back(y);
g[1][y].push_back(x);
}
void inline rel(int x,int y)
{
muchie(x,y );
muchie(y^1,x^1);
}
int main()
{
fin>>n>>m;
for(i=1; i<=m; i++)
{
int x,y;
fin>>x>>y;
x=(abs(x)-1)*2+(x<0);
y=(abs(y)-1)*2+(y<0);
rel(x^1,y);
}
// for(i=0;i<=7;i++)
// {
// cout<<i<<": ";
// for(auto it:g[0][i])
// cout<<it<<' ';cout<<'\n';
// }
tip=0;
for(i=0; i<2*n; i++)
if(!viz[i])
dfs(i);
tip=1;
k=0;
// for(i=-n;i<=n;i++)
// cout<<i<<' '<<(abs(i)-1)*2+(i<0)<<'\n';
for(i=o[0]; i; i--)
if(viz[o[i]])
{
k++;
dfs(o[i]);
}
// for(i=1;i<=o[0];i++)
// cout<<o[i]<<' ';cout<<'\n';
// cout<<"JEff\n";
// for(i=1;i<=k;i++)
// {
// cout<<i<<": ";
// for(auto it:nodes[i])
// cout<<it<<' ';
// cout<<'\n';
// }
go(1,1);
for(i=1; i<=k; i++)
if(!done[i])
go(i,0);
bool ok=0;
for(i=0; i<2*n; i++)
if(r[cul[i]]^r[cul[i^1]]==0)
ok=1;
for(i=0; i<2*n; i++)
if(r[cul[i]])
for(auto it:g[0][i])
if(!r[cul[it]])
ok=1;
if(ok)
{
for(i=1; i<=k; i++)
if(r[i])
r[i]=0;
else
r[i]=1;
ok=0;
for(i=0; i<2*n; i++)
if((r[cul[i]]^r[cul[i^1]])==0)
ok=1;
for(i=0; i<2*n; i++)
if(r[cul[i]])
for(auto it:g[0][i])
if(!r[cul[it]])
ok=1;
if(ok)
{
fout<<-1;
return 0;
}
}
for(i=0; i<2*n; i+=2)
fout<<r[cul[i]]<<' ';
return 0;
}