Pagini recente » Cod sursa (job #2273660) | Cod sursa (job #1137578) | Cod sursa (job #1384215) | Cod sursa (job #1637924) | Cod sursa (job #1936918)
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define nmax 200005
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[nmax],p[nmax];
bitset <nmax> b;
stack <int> s;
int n,m,sol[nmax];
int cod(int x)
{
if (x<0)
return n-x;
return x;
}
int opus(int x)
{
if (x<=n)
return x+n;
return x-n;
}
void dfs(int x)
{
int i,y;
b[x]=1;
for (i=0;i<v[x].size();i++) {
y=v[x][i];
if (b[y]==0)
dfs(y);
s.push(x);
}
}
void dft(int x)
{
if (sol[x]) {
sol[0]=-1;
return ;
}
int i,y;
sol[opus(x)] = 1;
b[x]=0;
for (i=0;i<p[x].size();i++) {
y=p[x][i];
if (b[y]==1)
dft(y);
}
}
void implic(int x,int y)
{
v[cod(x)].push_back(cod(y));
p[cod(y)].push_back(cod(x));
}
int main()
{
int i,j,x,y;
f>>n>>m;
for (i=1;i<=m;i++) {
f>>x>>y;
implic(-x,y);
implic(-y,x);
}
for (i=1;i<=2*n;i++)
if (b[i]==0)
dfs (i);
while (!s.empty()) {
i=s.top();
s.pop();
if (b[i]==1&&b[opus(i)]==1)
dft(i);
}
if (sol[0]==-1) {
g<<-1<<'\n';
return 0;
}
for (i=1;i<=n;i++)
g<<sol[i]<<' ';
return 0;
}