Pagini recente » Cod sursa (job #2744495) | Cod sursa (job #2582134) | Cod sursa (job #643836) | Cod sursa (job #807830) | Cod sursa (job #1704358)
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int const NMax = 200005;
vector <int> G[NMax], GT[NMax];
int use[NMax], Ord[NMax], Sol[NMax];
int n, m, k, ok = 1;
int Non(int nod)
{
if(nod <= n)
return (nod + n);
return (nod - n);
}
void Read()
{
int x, y, nx, ny;
f>>n>>m;
for(int i=1; i<=m; i++){
f>>x>>y;
nx = n + x;
ny = n + y;
if(x < 0){
x = n - x;
nx = x - n;
}
if(y < 0){
y = n - y;
ny = y - n;
}
G[nx].push_back(y);
GT[y].push_back(nx);
G[ny].push_back(x);
GT[x].push_back(ny);
}
}
void DFSP(int nod)
{
use[nod] = 1;
vector <int>::iterator it;
for(it = G[nod].begin(); it!=G[nod].end(); it++)
if(!use[*it])
DFSP(*it);
Ord[++k] = nod;
}
void DFSM(int nod)
{
use[nod] = 2;
use[Non(nod)] = 2;
Sol[nod] = 0;
Sol[Non(nod)] = 1;
vector <int>::iterator it;
for(it = GT[nod].begin(); it != GT[nod].end(); it++)
if(use[*it] == 1)
DFSM(*it);
}
void Solve()
{
int i;
for(i=1; i<=2*n; i++)
Sol[i] = -1;
for(i=1; i<=2*n; i++)
if(!use[i])
DFSP(i);
for(i=2*n; i>0; i--)
if(use[Ord[i]] == 1)
DFSM(Ord[i]);
}
void Print()
{
int i;
vector <int>::iterator it;
for(i=1; i<=2*n; i++)
for(it = G[i].begin(); it != G[i].end(); it++)
if((!Sol[i] || Sol[*it]) == 0){
g<<-1<<"\n";
return;
}
for(i=1; i<=2*n; i++)
if(Sol[i] == -1){
g<<-1<<"\n";
return;
}
for(i=1; i<=n; i++)
g<<Sol[i]<<" ";
g<<"\n";
}
int main()
{
Read();
Solve();
Print();
return 0;
}