Pagini recente » Cod sursa (job #884271) | Cod sursa (job #557834) | Cod sursa (job #911898) | Cod sursa (job #2861557) | Cod sursa (job #1155019)
#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);
}
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++)
sol[i]=-1;
for(i=nr;i>=1;i--) {
//cout<<endl<<SCC[i][0];
if(sol[SCC[i][0]]!=-1)
continue;
for(vector <int> :: iterator it=SCC[i].begin();it!=SCC[i].end();it++) {
sol[*it]=1;
sol[NEG(*it)]=0;
}
}
for(i=1;i<=n;i++)
g<<sol[i]<<" ";
return 0;
}