Pagini recente » Cod sursa (job #3245613) | Cod sursa (job #787390) | Cod sursa (job #1690620) | Cod sursa (job #2422886) | Cod sursa (job #602996)
Cod sursa(job #602996)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int n, m;
int viz[200002], sol[200002], st[200002];
vector <int> v[200002], vt[200002];
inline int neg (int x)
{
return x > n ? x - n : x + n;
}
void add (int x, int y)
{
v[neg(x)].push_back (y);
vt[y].push_back (neg (x));
v[neg(y)].push_back (x);
v[x].push_back (neg (y));
}
void dfs (int nod)
{
if (viz[nod])
return;
viz[nod] = 1;
for (vector <int> :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
dfs (*it);
st[++st[0]] = nod;
}
void dfs2 (int nod)
{
if (viz[nod])
return;
viz[nod] = 1;
sol[neg (nod)] = 1;
for (vector <int> :: iterator it = vt[nod].begin(); it != vt[nod].end(); it ++)
dfs2 (*it);
}
int main ()
{
freopen ("andrei.in", "r", stdin);
freopen ("andrei.out", "w", stdout);
scanf ("%d %d", &n, &m);
int i, x, y, c;
for (i = 1; i <= m; i ++)
{
scanf ("%d %d %d", &x, &y, &c);
if (c == 0)
add (x, y);
if (c == 1)
add (neg(x), neg(y));
if (c == 2)
add (neg(x), y), add (x, neg(y));
}
for (i = 1; i <= 2 * n; i ++)
dfs (i);
memset (viz, 0, sizeof (viz));
for (i = 2 * n; i; i --)
if (!viz[st[i]] && !viz[neg(st[i])])
dfs2 (st[i]);
for (i = 1; i <= n; i ++)
printf ("%d ", sol[i]);
return 0;
}