Pagini recente » Cod sursa (job #306969) | Statistici Bucur Antonia Marina (bucurantonia) | Cod sursa (job #1478545) | Cod sursa (job #1713288) | Cod sursa (job #2003309)
#include <bits/stdc++.h>
#define MAXN 200000
std::vector <int> g[MAXN + 1], rev[MAXN + 1];
std::vector <int> top;
int n;
inline int check(int nod) {
if(nod < 0)
nod += 2 * n;
else
nod--;
return nod;
}
bool viz[MAXN + 1];
void dfs1(int nod) {
viz[nod] = 1;
for(auto it : g[nod])
if(viz[it] == 0)
dfs1(it);
top.push_back(nod);
}
int pos[MAXN + 1];
int cnt = 0;
void dfs2(int nod) {
viz[nod] = 1;
pos[nod] = cnt;
for(auto it : rev[nod])
if(viz[it] == 0)
dfs2(it);
}
int main(){
FILE *fi, *fout;
int i, m, x, y;
fi = fopen("2sat.in" ,"r");
fout = fopen("2sat.out" ,"w");
fscanf(fi,"%d %d " ,&n,&m);
for(i = 1; i <= m; i++) {
fscanf(fi,"%d %d " ,&x,&y);
g[check(-x)].push_back(check(y));
g[check(-y)].push_back(check(x));
rev[check(y)].push_back(check(-x));
rev[check(x)].push_back(check(-y));
}
for(i = 0; i < 2 * n; i++)
if(viz[i] == 0)
dfs1(i);
memset(viz, 0, sizeof(viz));
for(i = top.size() - 1; i >= 0; i--)
if(viz[top[i]] == 0) {
cnt++;
dfs2(top[i]);
}
for(i = 1; i <= n; i++)
if(pos[check(i)] == pos[check(-i)]) {
fprintf(fout,"-1");
return 0;
}
for(i = 1; i <= n; i++)
fprintf(fout,"%d " ,pos[check(i)] > pos[check(-i)]);
fclose(fi);
fclose(fout);
return 0;
}