Pagini recente » Cod sursa (job #2940667) | Cod sursa (job #2232569) | Cod sursa (job #1108705) | Cod sursa (job #1717948) | Cod sursa (job #430567)
Cod sursa(job #430567)
#include<stdio.h>
#include<vector>
#include<stack>
#define Nmax 200010
using namespace std;
int i,n,m,ctc[Nmax],ST[Nmax],lowlink[Nmax],Index[Nmax],viz[Nmax],idx,sol[Nmax],nn,M,TC,x,y;
vector<int> G[Nmax],Ctc[Nmax];
stack<int> S;
int non (int x)
{
if( x <= n) return x+n;
return x-n;
}
void tarjan(int nod)
{
viz[nod]=1;
lowlink[nod]=idx;
Index[nod]=idx;
idx++;
S.push(nod);
int i,fiu,N=G[nod].size();
for(i=0;i<N;i++)
{
fiu=G[nod][i];
if(!Index[fiu])
{
tarjan(fiu);
if(lowlink[fiu]<lowlink[nod]) lowlink[nod]=lowlink[fiu];
}
else if(viz[fiu])
if(lowlink[fiu]<lowlink[nod]) lowlink[nod]=lowlink[fiu];
}
if(Index[nod]==lowlink[nod])
{
TC++;
do
{
N=S.top();
S.pop();
Ctc[TC].push_back(N);
viz[N]=0;
ctc[N]=TC;
}
while(N!=nod);
}
}
void sortaret (int C)
{
viz[C]=1;
int N=Ctc[C].size(),i,j,nod,fiu,mSize;
for(i=0;i<N;i++)
{
nod=Ctc[C][i];
mSize=G[nod].size();
for(j=0;j<mSize;j++)
{
fiu=G[nod][j];
if(ctc[nod]!=ctc[fiu] && !viz[ctc[fiu]])
sortaret(ctc[fiu]);
}
}
ST[M--]=C;
}
void atribuie (int C)
{
viz[C]=0;
int N=Ctc[C].size(),i,fiu;
for(i=0;i<N;i++)
{
fiu=Ctc[C][i];
sol[fiu]=0;
sol[non(fiu)]=1;
viz[ctc[non(fiu)]]=0;
}
}
int main()
{
freopen("2sat.in","r",stdin);
freopen("2sat.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(x<0) x=non(-x);
if(y<0) y=non(-y);
G[non(x)].push_back(y);
G[non(y)].push_back(x);
}
nn=n<<1;
for(i=1;i<=nn;i++)
if(!Index[i]) tarjan(i);
for(i=1;i<=n;i++)
if(ctc[i]==ctc[non(i)]) {printf("-1"); return 0;}
M=TC;
for(i=1;i<=TC;i++)
if(!viz[i]) sortaret(i);
for(i=1;i<=TC;i++)
if(viz[ST[i]])
atribuie(ST[i]);
for(i=1;i<=n;i++)
printf("%d ",sol[i]);
return 0;
}