Pagini recente » Cod sursa (job #59897) | Cod sursa (job #1475005) | Cod sursa (job #2024401) | Cod sursa (job #1897130) | Cod sursa (job #1414064)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream F("2sat.in");
ofstream G("2sat.out");
const int N = 200010;
int n,m,ans[N],mark[N];
vector<int> v[N],w[N],stk;
int neg(int x)
{
return x <= n ? n + x : x - n;
}
void tsort(int x)
{
mark[x] = 1;
for (int i=0;i<int(v[x].size());++i)
{
int y = v[x][i];
if ( mark[y] == 0 )
tsort(y);
}
stk.push_back(x);
}
int sol = 1;
void solve(int x)
{
if ( ans[x] ) return void(sol = 0);
mark[x] = 1;
ans[neg(x)] = 1;
ans[x] = 0;
for (int i=0;i<int(w[x].size());++i)
{
int y = w[x][i];
if ( mark[y] == 0 )
solve(y);
}
}
int main()
{
F>>n>>m;
for (int i=1,x,y;i<=m;++i)
{
F>>x>>y;
if ( x < 0 )
x = -x;
else
x += n;
if ( y < 0 )
y = -y;
else
y += n;
v[neg(x)].push_back(y);
v[neg(y)].push_back(x);
w[y].push_back(neg(x));
w[x].push_back(neg(y));
}
for (int i=1;i<=2*n;++i)
if ( mark[i] == 0 )
tsort(i);
memset(mark,0,sizeof(mark));
while ( !stk.empty() )
{
int x = stk.back();
stk.pop_back();
if ( mark[x] == 0 && mark[neg(x)] == 0 )
solve(x);
}
if ( sol == 0 )
{
G<<"-1\n";
return 0;
}
for (int i=n+1;i<=2*n;++i)
G<<ans[i]<<' ';
G<<'\n';
}