Pagini recente » Cod sursa (job #2232165) | Cod sursa (job #2580431) | Cod sursa (job #593112) | Cod sursa (job #1715730) | Cod sursa (job #2418984)
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int m,x,inv[200011],sol[200011],ok,low[200011],niv[200011],d[200011],n,i,j,lvl,a,b,nr,k;
vector<int> s,v[200011];
set<int> S;
void dfs(int nod)
{
low[nod]=++lvl;niv[nod]=lvl;
d[nod]=1;
s.push_back(nod);
for(auto vecin:v[nod])
{
if(niv[vecin]&&d[vecin])
low[nod]=min(low[nod],niv[vecin]);
if(niv[vecin]==0)
{
dfs(vecin);
low[nod]=min(low[nod],low[vecin]);
}
}
if(niv[nod]==low[nod])
{
S.clear();
do
{
x=s.back();s.pop_back();d[x]=0;
if(S.find(inv[x])!=S.end()) ok=-1;
S.insert(x);
if(sol[x]==0) sol[x]=1,sol[inv[x]]=-1;
}while(x!=nod);
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b;
v[-a+n].push_back(b+n);
v[-b+n].push_back(a+n);
}
for(i=0;i<n;i++) inv[i]=2*n-i,inv[2*n-i]=i;
for(i=0;i<=n*2;i++)
if(niv[i]==0&&i!=n)
dfs(i);
if(ok==-1) fout<<"-1";
else for(i=n+1;i<=2*n;i++) if(sol[i]==-1) fout<<"0 "; else fout<<"1 ";
return 0;
}