Pagini recente » Cod sursa (job #2234430) | Cod sursa (job #1915623) | Cod sursa (job #33598) | Cod sursa (job #800795) | Cod sursa (job #2232668)
#include <fstream>
#include <vector>
#define nmax 200005
using namespace std;
fstream f1("2sat.in", ios::in);
fstream f2("2sat.out", ios::out);
vector<int> v[nmax], nr[nmax], vr[nmax];
int n, m, viz[nmax],l[nmax], nrl, ctc[nmax], nrctc, sol[nmax];
int id(int nod)
{
if(nod>0) return nod;
else return n-nod;
}
int negat(int nod)
{
if(nod>n) return nod-n;
else return nod+n;
}
void citire()
{
int x, y;
f1>>n>>m;
while(m--)
{
f1>>x>>y;
v[id(-x)].push_back(id(y));
v[id(-y)].push_back(id(x));
vr[id(y)].push_back(id(-x));
vr[id(x)].push_back(id(-y));
}
}
void dfs(int nod)
{
viz[nod]=1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
if(!viz[*it])
dfs(*it);
nrl++; l[nrl]=nod;
}
void DFS(int nod)
{
viz[nod]=1;
ctc[nod]=nrctc;
nr[nrctc].push_back(nod);
for(auto it=vr[nod].begin(); it!=vr[nod].end(); ++it)
if(!viz[*it])
DFS(*it);
}
void kosaraju()
{
int i;
for(i=1; i<=2*n; i++)
if(!viz[i])
dfs(i);
for(i=1; i<=2*n; i++) viz[i]=0;
for(i=nrl; i>=1; i--)
if(!viz[l[i]])
{
nrctc++;
DFS(l[i]);
}
}
void solutie()
{
int i;
for(i=1; i<=n; i++)
if(ctc[i]==ctc[i+n])
{
f2<<-1; return;
}
for(i=1; i<=2*n; i++)
sol[i]=-1;
for(i=1; i<=nrctc; i++)
if(sol[nr[i][0]]==-1)
{
for(auto it=nr[i].begin(); it!=nr[i].end(); ++it)
{
sol[*it]=0;
sol[negat(*it)]=1;
}
}
for(i=1; i<=n; i++)
f2<<sol[i]<<' ';
}
int main()
{
citire();
kosaraju();
solutie();
return 0;
}