Pagini recente » Cod sursa (job #1801685) | Cod sursa (job #2572675) | Istoria paginii template/noprofile | Profil smart_girl | Cod sursa (job #1568149)
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int nmax=100000,dnmax=200000;
vector<int> ve[dnmax+5],inv[dnmax+5],mco[dnmax+5];
bool be[dnmax+5],el[dnmax+5],tr[dnmax+5];
int co[dnmax+5],li[dnmax+5],in[dnmax+5],ou[dnmax+5],op[dnmax+5];
int lu,nc;
int neg(int x)
{
if(x>nmax)
return x-nmax;
return x+nmax;
}
void dfs(int x)
{
be[x]=1;
for(int i=ve[x].size()-1;i>=0;i--)
if(be[ve[x][i]]==0)
dfs(ve[x][i]);
lu++;
li[lu]=x;
}
void baga(int x)
{
co[x]=nc;
for(int i=inv[x].size()-1;i>=0;i--)
{
if(co[inv[x][i]]==0)
baga(inv[x][i]);
}
}
void elim(int x)
{
for(int i=mco[x].size()-1;i>=0;i--)
if(el[mco[x][i]]==0)
elim(mco[x][i]);
if(el[x]==0)
{
tr[x]=1;
tr[op[x]]=0;
el[x]=1;
el[op[x]]=1;
}
}
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
int n,m,i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x<0)
x=x*(-1)+nmax;
if(y<0)
y=y*(-1)+nmax;
ve[neg(x)].push_back(y);
inv[y].push_back(neg(x));
ve[neg(y)].push_back(x);
inv[x].push_back(neg(y));
}
lu=nc=0;
for(i=1;i<=dnmax;i++)
if(be[i]==0)
dfs(i);
for(i=lu;i>=1;i--)
if(co[li[i]]==0)
{
nc++;
baga(li[i]);
}
for(i=1;i<=dnmax;i++)
{
op[co[i]]=co[neg(i)];
if(co[i]==co[neg(i)])
{
printf("-1\n");
return 0;
}
}
for(i=1;i<=dnmax;i++)
for(j=ve[i].size()-1;j>=0;j--)
{
if(co[i]!=co[ve[i][j]])
{
mco[co[i]].push_back(co[ve[i][j]]);
ou[co[i]]++;
in[co[ve[i][j]]]++;
}
}
for(i=1;i<=nc;i++)
if(el[i]==0)
{
elim(i);
}
for(i=1;i<=n;i++)
printf("%d ",tr[co[i]]);
return 0;
}