Cod sursa(job #467286)
#include <cstdio>
#include <vector>
using namespace std;
#define nmax 100010
#define f first
#define s second
int n, m;
vector <pair<int, int> > g[nmax];
int r[nmax];
int cmp (pair <int, int> a, pair<int, int> b)
{
return a.s>b.s;
}
int dfs(int nod)
{
int i, c;
for (i=0; i<g[nod].size(); i++)
{
if (r[g[nod][i].f]!=-1)
{
if (g[nod][i].s==2 && r[nod]!=r[g[nod][i].f]) return 0; else
if (g[nod][i].s==0 && r[nod]==0 && r[g[nod][i].f]==0) return 0; else
if (g[nod][i].s==1 && r[nod]==1 && r[g[nod][i].f]==1) return 0;
} else
{
if (g[nod][i].s==0)
{
if (r[nod]==0)
{
r[g[nod][i].f]=1;
c=dfs(g[nod][i].f);
if (!c) r[g[nod][i].f]=-1;
} else
{
r[g[nod][i].f]=1;
c=dfs(g[nod][i].f);
if (!c)
{
r[g[nod][i].f]=0;
c=dfs(g[nod][i].f);
if (!c) r[g[nod][i].f]=-1;
}
}
} else
if (g[nod][i].s==1)
{
if (r[nod]==1)
{
r[g[nod][i].f]=0;
c=dfs(g[nod][i].f);
if (!c) r[g[nod][i].f]=-1;
} else
{
r[g[nod][i].f]=0;
c=dfs(g[nod][i].f);
if (!c)
{
r[g[nod][i].f]=1;
c=dfs(g[nod][i].f);
if (!c) r[g[nod][i].f]=-1;
}
}
} else
if (g[nod][i].s==2)
{
r[g[nod][i].f]=r[nod];
c=dfs(g[nod][i].f);
if (!c) r[g[nod][i].f]=-1;
}
return c;
}
}
return 1;
}
int main()
{
freopen("andrei.in","r",stdin);
freopen("andrei.out","w",stdout);
scanf("%d %d",&n,&m);
int x, y, c, i, j;
while (m--)
{
scanf("%d %d %d",&x,&y,&c);
g[x].push_back(make_pair(y,c));
g[y].push_back(make_pair(x,c));
}
for (i=1; i<=n; i++) r[i]=-1;
for (i=1; i<=n; i++)
if (r[i]==-1)
{
r[i]=0;
c=dfs(i);
if (!c)
{
r[i]=1;
c=dfs(i);
}
}
for (i=1; i<=n; i++)
if (r[i]==-1) r[i]=0;
for (i=1; i<=n; i++) printf("%d ",r[i]);
}