Pagini recente » Cod sursa (job #2329018) | Cod sursa (job #3137361) | Cod sursa (job #337027) | Cod sursa (job #3173203) | Cod sursa (job #1750934)
# include <fstream>
# include <vector>
# include <algorithm>
# define DIM 200010
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector <int> Lista[DIM],ctc[DIM];
int Marcat[DIM],s[DIM],poz[DIM],low[DIM],val[DIM],vec[DIM];
int n,m,x,y,u,nr,nctc,i,j,ok,loc,k;
int vall(int x){
if(x>0)
return x;
else
return n-x;
}
int pf(int x){
if(x>n)
return x-n;
else
return x;
}
int sw(int x){
if(x>n)
return x-n;
else
return x+n;
}
void tarjan(int nc){
nr++;
poz[nc]=nr;
low[nc]=nr;
s[++u]=nc;
Marcat[nc]=1;
for(int i=0;i<Lista[nc].size();i++){
int nv=Lista[nc][i];
if(poz[nv]){
if(Marcat[nv])
low[nc]=min(low[nc],low[nv]);
}
else{
tarjan(nv);
low[nc]=min(low[nc],low[nv]);
}
}
if(low[nc]==poz[nc]){
nctc++;
ok=1;
while(s[u]!=nc){
if(val[s[u]]+1){
ok=0;
loc=val[s[u]];
}
ctc[nctc].push_back(s[u]);
Marcat[s[u]]=0;
u--;
}
if(val[nc]+1){
ok=0;
loc=val[nc];
}
if(ok){
val[nc]=1;
loc=1;
}
val[sw(nc)]=1-loc;
ctc[nctc].push_back(nc);
Marcat[nc]=0;
u--;
}
}int main () {
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y;
x=vall(x);
y=vall(y);
Lista[sw(x)].push_back(y);
Lista[sw(y)].push_back(x);
}
for(i=1;i<=2*n;i++)
val[i]=-1;
for(i=1;i<=2*n;i++)
if(!poz[i])
tarjan(i);
ok=1;
for(i=1;i<=nctc;i++)
for(j=ctc[i].size()-2;j>=0;j--)
val[ctc[i][j]]=val[ctc[i][j+1]];
for(i=1;i<=nctc;i++){
k=0;
for(j=ctc[i].size()-1;j>=0;j--)
vec[++k]=pf(ctc[i][j]);
sort(vec+1,vec+k+1);
for(j=0;j<ctc[i].size();j++)
ctc[i][j]=vec[j+1];
for(j=1;j<ctc[i].size();j++)
if(ctc[i][j]==ctc[i][j-1])
ok=0;
}
if(ok)
for(i=1;i<=n;i++)
fout<<val[i]<<" ";
else
fout<<-1;
fout<<"\n";
return 0;
}