Pagini recente » Cod sursa (job #752473) | Cod sursa (job #1572418) | Cod sursa (job #1783320) | Cod sursa (job #153617) | Cod sursa (job #2738648)
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int lim=1e5+4;
vector<int> dir[2*lim];
vector<int> rev[2*lim];
int n,m,x,y;
int val(int x)
{
if(x>0) return x;
return n-x;
}
bool ok[2*lim];
stack<int> st;
void df(int nod)
{
ok[nod]=true;
for(int x:dir[nod])
if(!ok[x]) df(x);
st.push(nod);
}
vector<int> elem[2*lim];
int grupa[2*lim],cnt;
void df2(int nod)
{
ok[nod]=true;
grupa[nod]=cnt;
elem[cnt].push_back(nod);
for(int x:rev[nod])
if(!ok[x]) df2(x);
}
vector<int> vec[2*lim];
int fin[lim];
void df3(int nod)
{
ok[nod]=true;
for(int x:vec[nod])
if(!ok[x]) df3(x);
st.push(nod);
}
bool restrict[2*lim];
int valr(int a)
{
if(a<=n) return a;
return a-n;
}
int sgn(int a,int v)
{
if(a>n) return 1-v;
return v;
}
int inv(int a)
{
if(a<=n)
a+=n;
else a-=n;
return a;
}
int main()
{
in>>n>>m;
for(int i=1;i<=m;++i)
{
in>>x>>y;
dir[val(-x)].push_back(val(y));
dir[val(-y)].push_back(val(x));
rev[val(y)].push_back(val(-x));
rev[val(x)].push_back(val(-y));
}
for(int i=1;i<=2*n;++i)
fin[i]=-1;
for(int i=1;i<=2*n;++i)
if(!ok[i]) df(i);
memset(ok,0,sizeof(ok));
while(!st.empty())
{
int x=st.top();
st.pop();
if(ok[x]) continue;
++cnt;
df2(x);
}
for(int i=1;i<=n;++i)
if(grupa[i]==grupa[i+n])
{
out<<-1<<'\n';
return 0;
}
for(int i=1;i<=2*n;++i)
for(int x:dir[i])
if(grupa[x]!=grupa[i])
vec[grupa[x]].push_back(grupa[i]);
memset(ok,0,sizeof(ok));
for(int i=1;i<=cnt;++i)
if(!ok[i]) df3(i);
while(!st.empty())
{
int x=st.top();
st.pop();
if(fin[valr(elem[x].back())]!=-1)
continue;
if(restrict[x])
{
for(int a:vec[x])
restrict[a]=true;
for(int a:elem[x])
fin[valr(a)]=sgn(a,1);
}
else
{
for(int a:elem[x])
fin[valr(a)]=sgn(a,0);
int y=grupa[inv(elem[x].back())];
restrict[y]=true;
for(int a:vec[y])
restrict[a]=true;
}
}
for(int i=1;i<=n;++i)
out<<fin[i]<<' ';
return 0;
}