Pagini recente » Cod sursa (job #2056886) | Cod sursa (job #675916) | Cod sursa (job #2849584) | Cod sursa (job #1450029) | Cod sursa (job #1690108)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
queue <int> q;
vector <int> v[200005],vt[200005],c[200005],vc[200005];
int n,m,k,nrc,use[200005],comp[200005],a[200005],edge[200005],solved[200005],val[200005],gr[200005];
int Neg(int x)
{ if (x>n) return x-n;
return x+n;
}
void DFS(int x)
{ int i;
use[x]=1;
for(i=0;i<v[x].size();i++)
if (!use[v[x][i]]) DFS(v[x][i]);
k++; a[k]=x;
}
void DFSC(int x)
{ int i;
use[x]=1;
comp[x]=nrc; c[nrc].push_back(x);
for(i=0;i<vt[x].size();i++)
if (!use[vt[x][i]]) DFSC(vt[x][i]);
}
void SortTop()
{ int i,nod;
while(!q.empty())
{ nod=q.front(); q.pop();
if (!solved[nod])
{ val[nod]=0;
val[comp[Neg(c[nod][0])]]=1;
solved[nod]=1;
solved[comp[Neg(c[nod][0])]]=1;
}
for(i=0;i<vc[nod].size();i++)
{gr[vc[nod][i]]--;
if (!gr[vc[nod][i]]) q.push(vc[nod][i]);
}
}
}
int main()
{ int i,j,t,nod,x,y,act;
f>>n>>m;
for(i=1;i<=m;i++)
{ f>>x>>y;
if (x<0) x=n-x;
if (y<0) y=n-y;
v[Neg(x)].push_back(y);
v[Neg(y)].push_back(x);
vt[y].push_back(Neg(x));
vt[x].push_back(Neg(y));
}
memset(use,0,sizeof(use));
for(i=1;i<=2*n;i++)
if (!use[i]) DFS(i);
memset(use,0,sizeof(use));
for(i=k;i>=1;i--)
if (!use[a[i]]) { nrc++; DFSC(a[i]); }
memset(use,0,sizeof(use));
for(i=1;i<=nrc;i++)
{
for(j=0;j<c[i].size();j++)
{ use[c[i][j]]=1;
if (use[Neg(c[i][j])]) {g<<"-1"<<"\n"; return 0;}
}
for(j=0;j<c[i].size();j++)
use[c[i][j]]=0;
}
memset(use,0,sizeof(use));
for(i=1;i<=nrc;i++)
{
act=0;
for(j=0;j<c[i].size();j++)
{ nod=c[i][j];
for(t=0;t<v[nod].size();t++)
if (comp[v[nod][t]]!=comp[nod] && !use[comp[v[nod][t]]])
{ vc[comp[nod]].push_back(comp[v[nod][t]]);
use[comp[v[nod][t]]]=1;
act++; edge[act]=comp[v[nod][t]];
}
}
for(j=1;j<=act;j++)
use[edge[j]]=0;
}
for(i=1;i<=nrc;i++)
{ for(j=0;j<vc[i].size();j++)
gr[vc[i][j]]++;
}
for(i=1;i<=nrc;i++)
if (!gr[i]) q.push(i);
SortTop();
for(i=1;i<=n;i++)
g<<val[comp[i]]<<" ";
return 0;
}