Pagini recente » Cod sursa (job #2932048) | Cod sursa (job #2015691) | Cod sursa (job #2829680) | Cod sursa (job #2283400) | Cod sursa (job #2368976)
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 100000
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int n,m,comp[(nmax<<1)+5],rang;
vector<int> g[(nmax<<1)+5],gt[(nmax<<1)+5];
vector<int> sol;
bitset< (nmax<<1)+5 > viz;
inline int change(int x) {return(x<0)?(abs(x)+n):x; }
inline int changesecond(int x) {return(x<0)?abs(x):x+n;}
void dfs(int nod)
{
viz[nod]=1;
for(int fiu: g[nod])
if(!viz[fiu])
dfs(fiu);
sol.push_back(nod);
}
void dfst(int nod)
{
comp[nod]=rang;
viz[nod]=0;
for(int fiu: gt[nod])
if(viz[fiu])
dfst(fiu);
}
int main()
{
fin>>n>>m;
int x,y;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
g[changesecond(x)].push_back(change(y));
g[changesecond(y)].push_back(change(x));
g[change(x)].push_back(changesecond(y));
g[change(y)].push_back(changesecond(x));
}
for(int i=1;i<=n<<1;i++)
if(!viz[i])
dfs(i);
while(sol.size())
{
if(viz[sol.back()])
++rang,dfst(sol.back());
sol.pop_back();
}
viz.reset();
for(int i=1;i<=n;i++)
if(comp[i]>comp[n+i])
viz[i]=1;
else if(comp[i]==comp[n+i])
{
fout<<-1;
return 0;
}
for(int i=1;i<=n;i++)
fout<<viz[i]<<" ";
return 0;
}