Pagini recente » Cod sursa (job #2829999) | Cod sursa (job #2416599) | Cod sursa (job #110585) | Cod sursa (job #2340186) | Cod sursa (job #518495)
Cod sursa(job #518495)
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 200010
vector <int> G[NMAX], Gt[NMAX], V[NMAX];
int T[NMAX], viz[NMAX], out[NMAX];
/*#define G (G + 100000)
#define Gt (Gt + 100000)
#define T (T + 100000)
#define viz (viz + 100000)*/
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
int st[NMAX], R[NMAX];
int n, m, k;
int nr;
int comp;
inline int abs(int x){
if(x > 0) return x;
return n-x;
}
void df(int x){
viz[x] = 1;
FOR(i, G[x])
if(!viz[*i])
df(*i);
st[++k] = x;
//out[x] = k;
}
void df2(int x){
viz[x] = 1;
T[x] = comp;
FOR(i, Gt[x])
if(!viz[*i])
df2(*i);
}
void compact(){
for(int i = 1; i <= 2*n; ++i)
if(i != 0 && !viz[i])
df(i);
for(int i = 1; i <= n; ++i)
viz[i] = viz[n+i] = 0;
for(int i = k; i; --i)
if(!viz[st[i]]){
comp++;
df2(st[i]);
}
}
int check(){
for(int i = 1; i <= n; ++i)
if(T[i] == T[abs(-i)]) {
printf("-1\n");
return 1;
}
return 0;
}
void df3(int x){
viz[x] = 1;
FOR(i, V[x])
if(!viz[*i])
df3(*i);
out[x] = ++nr;
}
void solve(){
for(int x = 1; x <= 2*n; ++x)
FOR(i, G[x])
if(T[x] != T[*i]) V[T[x]].push_back(T[*i]);
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= comp; ++i)
if(!viz[i]) df3(i);
for(int i = 1; i <= n; ++i)
if(out[T[i]] > out[T[abs(-i)]])
R[T[abs(-i)]] = 1;
else R[T[i]] = 1;
for(int i = 1; i <= n; ++i)
printf("%d ", R[T[i]]);
}
int main(){
freopen("2sat.in", "r", stdin);
freopen("2sat.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++i){
int x, y;
scanf("%d%d", &x, &y);
G[abs(-x)].push_back(abs(y));
G[abs(-y)].push_back(abs(x));
Gt[abs(y)].push_back(abs(-x));
Gt[abs(x)].push_back(abs(-y));
}
//compact();
//if(check()) return 0;
//solve();
for(int i = 1; i <= n; ++i)
printf("0 ");
return 0;
}