题目大意
有 n n n 个顶点,再给你 n − 1 n-1 n−1 条边,如果他们之间的权值为偶数则为相同颜色。
整体思路
这道题十分的简单,一个图的 dfs 遍历就 ok 了,我们只需判断权值是否为偶数就可以了,开始我们随便找个点当根节点标记为1(白色),然后开始模拟遍历。
代码(这里建图采用的是链式前向星)
#include<bits/stdc++.h>
using namespace std;
long long n,ans,tot=1,head[999999],o[999999];
struct t//构建链式前向星
{
long long xy,nx,qz;
};
t a[999999];
void js(long long u,long long v,long long w)//存图
{
a[tot].xy=v;
a[tot].qz=w;
a[tot].nx=head[u];
head[u]=tot++;
};
void dfs(long long g)//搜索
{
for(int i=head[g];i;i=a[i].nx)//遍历临接点
{
if(o[a[i].xy]==0)//如果当前没有颜色,则进入染色
{
if(a[i].qz%2==0)//颜色相同
{
o[a[i].xy]=o[g];
}
else
{
if(o[g]==1)//如果不同且点为白则染成黑
{
o[a[i].xy]=2;
}
else
o[a[i].xy]=1;//反之染白
}
dfs(a[i].xy);//继续向下遍历
}
}
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
long long u,v,w;
cin>>u>>v>>w;
js(u,v,w);
js(v,u,w);//由于式前向星是建单向边所以要两个边都存
}
o[1]=1;//标记为白色(2为黑色,这样个人认为更方便)
dfs(1);
for(int i=1;i<=n;i++)
{
cout<<o[i]-1<<endl;//因为前面数字代表的颜色大了1所以减去
}
}