Pagini recente » Cod sursa (job #510988) | Cod sursa (job #2339037) | Cod sursa (job #2095987) | Cod sursa (job #879407) | Cod sursa (job #1842978)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAX_N = 100005;
int n, m;
vector<int> G[2 * MAX_N], G2[2 * MAX_N];
int st[2 * MAX_N];
bool viz[2 * MAX_N];
bool ans[2 * MAX_N], sol = true;
inline int neg(int val) { return val > n ? val - n : val + n; }
void df(int nod)
{
viz[nod] = true;
vector <int> :: iterator it = G[nod].begin();
while(it != G[nod].end())
{
if(!viz[*it]) df(*it);
it++;
}
st[++st[0]] = nod;
}
void df2(int nod)
{
if(ans[nod]) sol = false;
viz[nod] = true;
ans[neg(nod)] = true;
vector <int> :: iterator it = G2[nod].begin();
while(it != G2[nod].end())
{
if(!viz[*it]) df2(*it);
it++;
}
}
int main()
{
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++)
{
int a, b;
scanf("%d %d", &a, &b);
if(a < 0) a = -a + n;
if(b < 0) b = -b + n;
G[neg(a)].push_back(b);
G[neg(b)].push_back(a);
G2[b].push_back(neg(a));
G2[a].push_back(neg(b));
}
for(int i=1; i<=2*n; i++)
if(!viz[i]) df(i);
memset(viz, false, sizeof(viz));
for(int i=2*n; i>=0; i--)
if(!viz[st[i]] && !viz[neg(st[i])])
df2(st[i]);
if(!sol) printf("-1\n");
else for(int i=1; i<=n; i++)
printf("%d ", ans[i]);
}