Pagini recente » Cod sursa (job #1764047) | Cod sursa (job #1736056) | Diferente pentru utilizator/robybrasov intre reviziile 32 si 31 | Cod sursa (job #3193606) | Cod sursa (job #1542740)
#include <fstream>
#include <vector>
#define NMAX 100000
using namespace std;
ifstream in("2sat.in");
ofstream o("2sat.out");
vector <int>G[NMAX];
vector <int>GT[NMAX];
vector <int>Cc[NMAX];
int L[NMAX];
int use[NMAX];
int C[NMAX];
int sol[NMAX];
int n,m,p;
void dfs(int x)
{
int i,lg;
lg=G[x].size();
for(i=0;i<lg;i++)
{
if(!use[G[x][i]])
{
use[G[x][i]]=1;
dfs(G[x][i]);
}
}
L[p]=x;
p--;
}
void dfs2(int x, int t)
{
int i,lg;
lg=GT[x].size();
for(i=0;i<lg;i++)
{
if(!C[GT[x][i]]){
C[GT[x][i]]=t;
Cc[t].push_back(GT[x][i]);
dfs2(GT[x][i],t);
}
}
}
void markall(int comp)
{
int i,lg=Cc[comp].size();
for(i=1;i<lg;i++)
sol[Cc[comp][i]]=sol[comp];
}
int main()
{
int i,x,y,a,t,y1,n2;
in>>n>>m;;
for(i=1;i<=m;i++)
{
in>>x>>y;
y1=y;
a=-x;
if(a>0)a--;
if(y>0)y--;
G[a+n].push_back(y+n);
GT[y+n].push_back(a+n);
y=y1;
a=-y;
if(a>0)a--;
if(x>0)x--;
G[a+n].push_back(x+n);
GT[x+n].push_back(a+n);
}
n=n<<1;
p=n-1;
for(i=0;i<n;i++)
{
if(!use[i])
{
use[i]=1;
dfs(i);
}
}
/*for(i=0;i<n;i++)
o<<L[i]<<' ';
o<<endl;*/
t=1;
for(i=0;i<n;i++)
{
if(!C[L[i]])
{
C[L[i]]=t;
Cc[t].push_back(L[i]);
dfs2(L[i],t);
t++;
}
}
n2=n>>1;
for(i=0;i<n2;i++)
{
if(C[i]==C[n-1-i])
{
o<<-1<<'\n';
return 0;
}
}
for(x=1;x<t;x++){
if(!sol[Cc[x][0]]){
y1=Cc[x].size();
for(y=0;y<y1;y++){
sol[Cc[x][y]]=1;
markall(x);
sol[n-Cc[x][y]-1]=2;
markall(C[n-Cc[x][y]-1]);
}
}
}
for(i=n2;i<n;i++)o<<sol[i]-1<<' ';
o<<'\n';
return 0;
}