Pagini recente » Cod sursa (job #721138) | Cod sursa (job #2843033) | Istoria paginii utilizator/zsuzsanna | Cod sursa (job #188858) | Cod sursa (job #1373417)
#include <cstdio>
using namespace std;
const int MAX_N = 100000, MAX_M = 200000;
FILE *in, *out;
struct graph {
int lst[2*MAX_N+1], urm[2*MAX_M+1], vf[2*MAX_M+1];
int nr;
void add(int x, int y)
{
nr++;
urm[nr] = lst[x];
vf[nr] = y;
lst[x] = nr;
}
};
graph G, GTrans;
int n, m;
bool sol[2*MAX_N+1];
int neg(int x)
{
return (x > n) ? x-n:x+n;
}
int st[2*MAX_N+1];
int nst;
bool viz[2*MAX_N+1];
void dfs1(int nod)
{
viz[nod] = true;
int p = G.lst[nod];
while(p != 0)
{
if(!viz[G.vf[p]])
dfs1(G.vf[p]);
p = G.urm[p];
}
st[++nst] = nod;
}
void dfs2(int nod)
{
viz[nod] = false;
//viz[neg(nod)] = false;
int p = GTrans.lst[nod];
sol[neg(nod)] = true;
while(p != 0)
{
if(viz[GTrans.vf[p]])
dfs2(GTrans.vf[p]);
p = GTrans.urm[p];
}
}
int main()
{
in = fopen("2sat.in", "r");
out = fopen("2sat.out", "w");
fscanf(in, "%d%d", &n, &m);
int x, y;
int i;
for(int i = 0; i < m; i++)
{
fscanf(in, "%d%d", &x, &y);
if(x < 0) x = neg(-x);
if(y < 0) y = neg(-y);
G.add(neg(x), y);
GTrans.add(y, neg(x));
G.add(neg(y), x);
GTrans.add(x, neg(y));
}
for(i = 1; i <= 2*n; i++)
if(!viz[i])
dfs1(i);
while(nst != 0)
{
if(!viz[st[nst]] && !viz[neg(st[nst])])
{
fprintf(out, "-1");
return 0;
}
if(viz[st[nst]] && viz[neg(st[nst])])
dfs2(st[nst]);
nst--;
}
for(i = 1; i <= n; i++)
fprintf(out, "%d ", sol[i]);
fclose(in);
fclose(out);
return 0;
}