Pagini recente » Cod sursa (job #2388289) | Cod sursa (job #2502437) | Cod sursa (job #762065) | Cod sursa (job #998333) | Cod sursa (job #2187706)
#include <bits/stdc++.h>
using namespace std;
ifstream fi( "2sat.in" ); ofstream fo( "2sat.out" );
const int maxn = 1e5 + 5;
const int maxm = 2e5 + 5;
vector <int> g[2 * maxn], rev[2 * maxn];
int n, m, top, ctc[maxn * 2], ord[maxn * 2];
bool seen[maxn * 2];
inline int index(int x) {
if (x < 0)
x = x * (-1) + n;
return x;
}
void firstDFS(int node) {
seen[ node ] = 1;
for (int son: g[ node ])
if (!seen[ son ])
firstDFS( son );
ord[ ++top ] = node;
}
void secondDFS(int node, int idx) {
seen[ node ] = 1;
ctc[ node ] = idx;
for (int son: rev[ node ])
if (!seen[ son ])
secondDFS(son, idx);
}
int main()
{
int x, y;
fi >> n >> m;
for (int i = 1; i <= m; i++) {
fi >> x >> y;
g[ index(-x) ].push_back( index(y) );
g[ index(-y) ].push_back( index(x) );
rev[ index(x) ].push_back( index(-y) );
rev[ index(y) ].push_back( index(-x) );
}
for (int i = 1; i <= 2 * n; i++)
if (!seen[ i ])
firstDFS( i );
memset(seen, 0, sizeof seen);
int code = 0;
for (int i = top; i >= 1; i--)
if (!seen[ ord[ i ] ]) {
code++;
secondDFS(ord[ i ], code);
}
for (int i = 1; i <= n; i++) {
if (ctc[ i ] == ctc[i + n]) {
fo << "-1";
return 0;
}
}
for (int i = 1; i <= n; i++)
fo << (ctc[ i ] > ctc[i + n]) << " ";
fo.close();
fi.close();
return 0;
}