Pagini recente » Cod sursa (job #1812430) | Cod sursa (job #1385783) | Cod sursa (job #198630) | Cod sursa (job #1839114) | Cod sursa (job #2653514)
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector<int>g[2*NMAX];
vector<int>gt[2*NMAX];
stack<int>H;
void citire();
vector<int> gr[2*NMAX];
int n,m,nrc,i,j;
int val[2*NMAX];
int pun(int k)
{
if(k<0)
return k=-k+n;
return k;
}
int neg(int k)
{
if(k>n)
return k-n;
return k+n;
}
int uz[2*NMAX];
void dfs(int k)
{
int i;
uz[k]=1;
for(i=0;i<g[k].size();i++)
{
int vec=g[k][i];
if(!uz[vec])
dfs(vec);
}
H.push(k);
}
void dfs1(int k)
{
int i;
uz[k]=nrc;
for(i=0;i<gt[k].size();i++)
{
int vec=gt[k][i];
if(!uz[vec])
dfs1(vec);
}
}
///gata
int main()
{citire();
for(i=1;i<=n*2;i++)
if(!uz[i])
{dfs(i);}
memset(uz,0,sizeof(uz));
while(!H.empty())
{
int act=H.top();
H.pop();
if(!uz[act])
{nrc++; dfs1(act);}
}
for(i=1;i<=n;i++)
if(uz[i]==uz[i+n])
{fout<<-1;return 0;}
for(i=1;i<=2*n;i++)
for(j=0;j< g[i].size();i++)
{
int vec=g[i][j];
if(uz[i]!=uz[vec])
gr[i].push_back(vec);
}
for(i=1,j=nrc;i<j;i++,j--)
{val[i]=0;val[j]=1;}
for(i=1;i<=n;i++)
fout<< val[ uz[i]]<<" ";
return 0;
}
void citire()
{
int i;
int x,y;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
int cx=pun(x);
int cy=pun(y);
int nx,ny;
nx=neg(cx);
ny=neg(cy);
g[nx].push_back(cy);
gt[cy].push_back(nx);
g[ny].push_back(cx);
gt[cx].push_back(ny);
}
}