Pagini recente » Cod sursa (job #1599664) | Cod sursa (job #428741) | Cod sursa (job #1738314) | Cod sursa (job #2178575) | Cod sursa (job #1218976)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<stack>
using namespace std;
const int NMAX = 2e5;
vector <int> graph[NMAX + 5], trans[NMAX + 5];
int n, pasdutout, vis[NMAX + 5], val[NMAX + 5];
stack <int> st;
inline int neg (int x) {
return x <= n ? x + n : x - n;
}
void dfsPlus (int node) {
vis[node] = 1;
for(vector <int>::iterator it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it])
dfsPlus(*it);
st.push(node);
}
void dfsMinus (int node) {
if(val[node])
pasdutout = 1;
vis[node] = 1;
val[neg(node)] = 1;
for(vector <int>::iterator it = trans[node].begin(); it != trans[node].end(); ++ it)
if(!vis[*it])
dfsMinus(*it);
}
int main() {
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
int m, i, a, b;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++ i) {
scanf("%d%d", &a, &b);
if(a < 0)
a = -a + n;
if(b < 0)
b = -b + n;
graph[neg(a)].push_back(b);
graph[neg(b)].push_back(a);
trans[b].push_back(neg(a));
trans[a].push_back(neg(b));
}
for(i = 1; i <= 2 * n; ++ i)
if(!vis[i])
dfsPlus(i);
memset(vis, 0, sizeof(vis));
while(!st.empty()) {
if(vis[st.top()] || vis[neg(st.top())]) {
st.pop();
continue;
}
dfsMinus(st.top());
// fprintf(stderr, "\n", st.top());
// for(i = 1; i <= n; ++ i)
// fprintf(stderr, "%d - %d ", i, vis[i]);
st.pop();
}
if(!pasdutout)
for(i = 1; i <= n; ++ i)
printf("%d ", val[i]);
else
printf("-1");
return 0;
}