Pagini recente » Cod sursa (job #986138) | Cod sursa (job #837622) | Cod sursa (job #1358579) | Cod sursa (job #342923) | Cod sursa (job #1975993)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("2sat.in");
ofstream fout ("2sat.out");
const int Nmax = 2e5 + 5;
vector<int> ord;
int n, m, x, y, i, comp[Nmax], nrc;
vector<int> v[Nmax], vv[Nmax];
int id(int x)
{
if(x<0) return x + 2*n;
return x-1;
}
void add_edge(int x, int y)
{
v[id(-x)].push_back(id(y)); vv[id(y)].push_back(id(-x));
v[id(-y)].push_back(id(x)); vv[id(x)].push_back(id(-y));
}
void dfs1(int node)
{
comp[node] = 1;
for(auto it : v[node])
if(!comp[it]) dfs1(it);
ord.push_back(node);
}
void dfs2(int node)
{
comp[node] = nrc;
for(auto it : vv[node])
if(!comp[it]) dfs2(it);
}
int main()
{
fin >> n >> m;
while(m--)
{
fin >> x >> y;
add_edge(x, y);
}
memset(comp, 0, sizeof(comp));
for(i=0; i<2*n; ++i)
if(!comp[i]) dfs1(i);
memset(comp, 0, sizeof(comp));
for(i=2*n-1; i>=0; --i)
if(!comp[ord[i]]) ++nrc, dfs2(ord[i]);
for(i=1; i<=n; ++i)
if( comp[id(i)] == comp[id(-i)] )
{
fout << -1 << '\n';
return 0;
}
for(i=1; i<=n; ++i) fout << ( comp[id(i)] > comp[id(-i)] ) << ' '; fout << '\n';
return 0;
}