Pagini recente » Cod sursa (job #2035985) | Cod sursa (job #490946) | Cod sursa (job #1295055) | Cod sursa (job #338145) | Cod sursa (job #2797791)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int N=200005;
int n, m;
bool viz1[N], viz2[N];
vector<bool> rasp;
vector<int> suc[N];
vector<int> pred[N];
vector<int> top;
int ctc[N], nrctc;
void dfs1(int x)
{
viz1[x]=1;
for(auto y: suc[x])
if(!viz1[y])
dfs1(y);
top.push_back(x);
}
void dfs2(int x)
{
viz2[x]=1;
ctc[x]=nrctc;
for(auto y: pred[x])
if(!viz2[y])
dfs2(y);
}
int main()
{
int x, y;
in>>n>>m;
for(int i=1; i<=m; i++)
{
in>>x>>y;
int a, b, na, nb;
if(x>0)
{
a=2*x;
na=2*x+1;
}else
{
a=-2*x+1;
na=-2*x;
}
if(y>0)
{
b=2*y;
nb=2*y+1;
}else
{
b=-2*y+1;
nb=-2*y;
}
suc[na].push_back(b);
pred[b].push_back(na);
suc[nb].push_back(a);
pred[a].push_back(nb);
}
for(int i=2; i<=2*n+1; i++)
if(!viz1[i])
dfs1(i);
for(int i=2*n; i>=0; i--)
{
if(!viz2[top[i]])
{
dfs2(top[i]);
nrctc++;
}
}
for(int i=2; i<=2*n; i+=2)
{
if(ctc[i]==ctc[i+1])
{
cout<<"-1";
return 0;
}
bool r=0;
if(ctc[i]>ctc[i+1])
r=1;
rasp.push_back(r);
}
for(auto i:rasp)
out<<i<<' ';
return 0;
}