Pagini recente » Cod sursa (job #2711550) | Cod sursa (job #2796723) | Cod sursa (job #1293127) | Cod sursa (job #2728799) | Cod sursa (job #2668042)
#include <bits/stdc++.h>
using namespace std;
ifstream in("2sat.in");
ofstream out("2sat.out");
const int nmax=1e5+1;
const int mmax=2e5+1;
vector <int> vec[2*nmax];
vector <int> vectranspus[2*nmax];
int minime[nmax];
int vizi[nmax*2], postord[2*nmax], componenta[2*nmax];
queue <int> q;
int n, m, marime, nrc;
int fr[2*nmax];
void DFS(int x)
{
vizi[x]=1;
for(int i=0; i<vec[x].size(); i++)
{
if(!vizi[vec[x][i]])
{
DFS(vec[x][i]);
}
}
postord[++marime]=x;
}
void DFST(int x)
{
componenta[x]=nrc;
vizi[x]=0;
for(int i=0; i<vectranspus[x].size(); i++)
{
if(vizi[vectranspus[x][i]])
{
vizi[vectranspus[x][i]]=0;
DFST(vectranspus[x][i]);
}
}
}
void rezolvare()
{
for(int i=1;i<=2*n;i++)
{
if(vectranspus[i].size()==0)
{
q.push(i);
}
for(int j=0;j<vectranspus[i].size();j++)
{
if(vectranspus[i][j] == componenta[i])
{
vectranspus[i][j]=0;
}
}
}
while(q.size())
{
int curent =q.front();
q.pop();
if(curent > n)
{
if(fr[curent-n] == 0)
{fr[curent-n]=3;
curent-=n;}
}
else
{
if(fr[curent]== 0)
{
fr[curent]=2;
}
}
for(int i=1;i<=2*n;i++)
{
bool ok = 0;
if(vectranspus[i].size())
{
for(int j=0;j<vectranspus[i].size();j++)
{
if(vectranspus[i][j] == componenta[curent])
{
vectranspus[i][j] = 0;
}
else
{if(vectranspus[i][j] == componenta[curent + n])
{
vectranspus[i][j] = 0;
}
else
{
if(vectranspus[i][j])
{
ok = 1;
}
}
}
}
}
else
{
ok = 1;
}
if(ok == 0)
{
q.push(i);
vectranspus[i].clear();
}
}
}
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
{
minime[i]=n+i;
}
for(int i=1; i<=m; i++)
{
int x, y, minx, miny;
in>>x>>y;
if(x<0)
{
minx=x*-1;
x*=-1;
x+=n;
}
else
{
minx=n+x;
}
if(y<0)
{
miny=y*-1;
y*=-1;
y+=n;
}
else
{
miny=n+y;
}
minime[x]=minx;
minime[y]=miny;
vec[minx].push_back(y);
vec[miny].push_back(x);
vectranspus[y].push_back(minx);
vectranspus[x].push_back(miny);
}
for(int i=1; i<=2*n; i++)
{
if(!vizi[i])
{
DFS(i);
}
}
for(int i=2*n; i>0; i--)
{
if(vizi[postord[i]])
{
nrc++;
DFST(postord[i]);
}
}
for(int i=1; i<=2*n; i++)
{
componenta[i]*=-1;
}
for(int i=1; i<=2*n; i++)
{
if(componenta[i] == componenta[minime[i]])
{
out<<"-1";
return 0;
}
for(int j=0; j<vectranspus[i].size(); j++)
{
vectranspus[i][j]=componenta[vectranspus[i][j]];
}
}
rezolvare();
for(int i=1;i<=n;i++)
{
out<<fr[i]-2<<" ";
}
return 0;
}