Pagini recente » Cod sursa (job #3134873) | Cod sursa (job #2408504) | Cod sursa (job #314997) | Cod sursa (job #2805503) | Cod sursa (job #2509100)
#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];
int apart[NMAX*2+5];
stack <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);
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);
if(nivel[vecin]>0) low[nod]=min(low[nod],low[vecin]);
}
if(nivel[nod]==low[nod])
{
comp++;
while(q.top()!=nod)
{
int vecin=q.top();
q.pop();
nivel[q.top()]*=-1;
apart[vecin]=comp;
if(apart[opus(vecin)]!=0 and apart[opus(vecin)]==apart[vecin])
{
afis_minus_unu=true;
return;
}
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;
}