Pagini recente » Cod sursa (job #566396) | Cod sursa (job #2456322) | Cod sursa (job #1315882) | Cod sursa (job #1022076) | Cod sursa (job #1465430)
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;
ofstream fout("2sat.out");
ifstream fin("2sat.in");
const int NMAX = 200010;
int n, m, lg, ok;
int S[NMAX], L[NMAX], R[NMAX];
bitset<NMAX> Viz, Poz, Neg;
vector<int> Graf[NMAX];
int nou(int val)
{
return (val <= n ? val + n : val - n);
}
void dfs(int nod)
{
Viz[nod] = true;
for(auto x : Graf[nod])
if(!Viz[x]) dfs(x);
S[++lg] = nod;
}
int main()
{
fin >> n >> m;
for(int i=1, x, y; i<=m; i++)
{
fin >> x >> y;
if(x < 0) x = n - x;
if(y < 0) y = n - y;
L[i] = x, R[i] = y;
Graf[nou(x)].push_back(y);
Graf[nou(y)].push_back(x);
}
for(int i=1; i<=n*2; i++)
if(!Viz[i]) dfs(i);
for(int i=lg; i; i--)
if(!Poz[nou(S[i])])
Poz[S[i]] = true;
else
Neg[S[i]] = !Neg[nou(S[i])];
for(int i=1; i<=m; i++)
if(!Neg[L[i]] && !Neg[R[i]])
{ ok = 1; break; }
if(ok) fout << -1 << '\n';
else for(int i=1; i<=n; i++)
fout << Neg[i] << ' ';
}