Pagini recente » Cod sursa (job #762744) | Cod sursa (job #1173490) | Cod sursa (job #1117765) | Cod sursa (job #1246458) | Cod sursa (job #2369005)
#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 ind(int x) {
if(x > 0) return x;
return n - x;
}
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)
{
viz[nod]=0;
for(int fiu: gt[nod])
if(viz[fiu])
dfst(fiu);
comp[nod]=rang;
}
int main()
{
fin>>n>>m;
int x,y;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
g[ind(-x)].emplace_back(ind(y));
gt[ind(y)].emplace_back(ind(-x));
g[ind(-y)].emplace_back(ind(x));
gt[ind(x)].emplace_back(ind(-y));
}
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;
}