Pagini recente » Cod sursa (job #534710) | Cod sursa (job #926557) | Cod sursa (job #240898) | Cod sursa (job #2827686) | Cod sursa (job #2509105)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
const int NMAX = 100000;
vector <long long> v[200005];
bool ver[NMAX*2+5];
int low[NMAX*2+5],rasp[NMAX*2+5],nivel[200005];
stack <int> q;
set <int> Q;
bool afis_minus_unu=false;
int d=0,comp=0;
int n,m,x,y;
int opus(int nod)
{
if(nod<0) return (-1)*nod;
if(nod<NMAX) return nod+NMAX;
return nod-NMAX;
}
int transf(int nod)
{
if(nod<0) return (-1)*nod+NMAX;
return nod;
}
void dfs(int nod)
{
q.push(nod);
ver[nod]=true;
low[nod]=nivel[nod]=++d;
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
if(nivel[vecin]==0){
dfs(vecin);
low[nod]=min(low[nod],low[vecin]);
}
else if(ver[vecin]!=0)
low[nod]=min(low[nod],nivel[vecin]);
}
if(nivel[nod]==low[nod])
{
Q.clear();
int vecin=0;
while(vecin!=nod)
{
vecin=q.top();
q.pop();
ver[vecin]=false;
if(Q.find(opus(vecin))!=Q.end())
afis_minus_unu=true;
Q.insert(vecin);
if(rasp[vecin]==0){
rasp[vecin]=1;
rasp[opus(vecin)]=-1;
}
}
}
}
int main()
{
fin >> n >> m;
/// avb <=> (~a -> b) ^ (~b -> a)
for(int i=1;i<=m;i++)
{
fin >> x >> y;
if(x<0 and y<0){
v[x*(-1)].push_back((-1)*y+NMAX);
v[y*(-1)].push_back((-1)*x+NMAX);
}
if(x<0 and y>0){
v[x*(-1)].push_back(y);
v[y+NMAX].push_back((-1)*x+NMAX);
}
if(x>0 and y<0){
v[y*(-1)].push_back(x);
v[x+NMAX].push_back((-1)*y+NMAX);
}
if(x>0 and y>0){
v[x+NMAX].push_back(y);
v[y+NMAX].push_back(x);
}
}
for(int i=1;i<=n;i++) if(nivel[i]==0) dfs(i);
for(int i=1;i<=n;i++) if(nivel[i+NMAX]==0) dfs(i+NMAX);
if(afis_minus_unu==true){
fout << -1;
return 0;
}
for(int i=1;i<=n;i++) fout << max(0,rasp[i]) << ' ';
return 0;
}