Pagini recente » Cod sursa (job #2872193) | Cod sursa (job #964923) | Cod sursa (job #1203191) | Cod sursa (job #2516177) | Cod sursa (job #608143)
Cod sursa(job #608143)
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std;
const char *FIN = "andrei.in", *FOU = "andrei.out";
const int MAX = 200005;
int N, M;
vector < vector <int> > GP, GM;
vector <int> Q;
vector <bool> VIZ, sol;
inline int NOT (int A) {
return A > N ? A - N : A + N;
}
void dfp (int S) {
VIZ[S] = 1;
for (vector <int> :: iterator it = GP[S].begin (); it != GP[S].end (); ++it)
if (VIZ[*it] == 0)
dfp (*it);
Q.push_back (S);
}
void dfm (int S) {
VIZ[S] = sol[NOT(S)] = 1;
for (vector <int> :: iterator it = GM[S].begin (); it != GM[S].end (); ++it)
if (VIZ[*it] == 0)
dfm (*it);
}
void baga (int x, int y) {
GP[NOT (x)].push_back (y);
GP[NOT (y)].push_back (x);
GM[x].push_back (NOT (y));
GM[y].push_back (NOT (x));
}
int main (void) {
freopen (FIN, "r", stdin);
freopen (FOU, "w", stdout);
scanf ("%d %d", &N, &M);
GP.resize (2 * N + 2), GM.resize (2 * N + 2);
VIZ.resize (2 * N + 2), sol.resize (2 * N + 2);
for (int i = 1, x, y, z; i <= M; ++i) {
scanf ("%d %d %d", &x, &y, &z);
if (z == 0) baga (x, y);
else if (z == 1) baga (NOT (x), NOT (y));
else baga (NOT (x), y), baga (x, NOT (y));
}
for (int i = 1; i <= N << 1; ++i)
if (VIZ[i] == 0)
dfp (i);
for (int i = 1; i <= N << 1; ++i)
VIZ[i] = false;
reverse (Q.begin (), Q.end ());
for (vector <int> :: iterator it = Q.begin (); it != Q.end (); ++it)
if (VIZ[*it] == 0 && VIZ[NOT (*it)] == 0)
dfm (*it);
for (int i = 1; i <= N; ++i)
printf ("%d ", sol[i] == true);
}