Pagini recente » Cod sursa (job #1983825) | Cod sursa (job #702676) | Cod sursa (job #1239635) | Istoria paginii utilizator/bazagazeal | Cod sursa (job #1154989)
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<string.h>
using namespace std;
#define NMAX 200001
vector <int> v[NMAX],vt[NMAX],SCC[NMAX];
int p[NMAX],viz[NMAX],poz[NMAX],sol[NMAX],c[NMAX],n,nr;
inline int NEG(int x)
{
int aux = x+n;
if(aux>2*n)
aux=aux-2*n;
return aux;
}
void dfs(int nod)
{
viz[nod]=1;
for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
if(viz[*it]==0)
dfs(*it);
p[++p[0]]=nod;
}
void dfst(int nod)
{
viz[nod]=1;
SCC[nr].push_back(nod);
poz[nod]=nr;
for(vector <int> :: iterator it=vt[nod].begin();it!=vt[nod].end();it++)
if(viz[*it]==0)
dfst(*it);
}
void dfss(int nod)
{
viz[nod]=1;
for(vector <int> :: iterator it=vt[nod].begin();it!=vt[nod].end();it++)
if(viz[*it]==0)
dfss(*it);
p[++p[0]]=nod;
}
int main ()
{
int m,i,x,y;
ifstream f("2sat.in");
ofstream g("2sat.out");
f>>n>>m;
for(i=1;i<=m;i++) {
f>>x>>y;
if(x<0)
x=abs(x)+n;
if(y<0)
y=abs(y)+n;
v[NEG(x)].push_back(y);
v[NEG(y)].push_back(x);
vt[y].push_back(NEG(x));
vt[x].push_back(NEG(y));
}
f.close();
for(i=1;i<=2*n;i++)
if(viz[i]==0)
dfs(i);
memset(viz,0,sizeof(viz));
for(i=p[0];i>=1;i--)
if(viz[p[i]]==0) {
nr++;
dfst(p[i]);
}
for(i=1;i<=2*n;i++)
if(poz[i]==poz[NEG(i)])
break;
if(i<=n) {
g<<"-1";
g.close();
return 0;
}
for(i=1;i<=2*n;i++)
vt[i].clear();
for(i=1;i<=n;i++)
for(vector <int> :: iterator it=v[i].begin();it!=v[i].end();it++)
if(poz[i]!=poz[*it])
vt[poz[i]].push_back(poz[*it]);
p[0]=0;
memset(viz,0,sizeof(viz));
for(i=1;i<=nr;i++)
if(viz[i]==0)
dfss(i);
for(i=1;i<=nr;i++)
c[i]=poz[NEG(SCC[i][0])];
for(i=1;i<=2*n;i++)
sol[i]=-1;
for(i=1;i<=p[0];i++) {
if(sol[SCC[p[i]][0]]!=-1)
continue;
for(vector <int> :: iterator it=SCC[p[i]].begin();it!=SCC[p[i]].end();it++) {
sol[*it]=0;
sol[NEG(*it)]=1;
}
}
for(i=1;i<=n;i++)
g<<sol[i]<<" ";
return 0;
}