題意
對一棵有 $N$ 個點,$N-1$ 條邊的樹進行黑白染色,使得每兩個距離為偶數的點顏色都一致。
思路
首先讓我們回顧一下加法的性質:
- 偶 $+$ 偶 $=$ 偶
- 奇 $+$ 奇 $=$ 偶
- 偶 $+$ 奇 $=$ 奇
不難看出,距離為偶數的關係是可以傳遞的,而距離為奇數的關係不行。
我們只需要做一遍 dfs
,對一個點 $x$ 的鄰接點中距離 $x$ 為偶數的點染成與 $x$ 相同的顏色,否則染成另外一種顏色,便可透過此題。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,s,d[100005],f;
ll ans;
ll head[200005],cnt=1;
ll color[100005];
bool flag[100005];
struct node{
ll to,next,val;
}edge[200005];
void add(ll x,ll y,ll z){
edge[cnt].to=y;
edge[cnt].val=z;
edge[cnt].next=head[x];
head[x]=cnt++;
}
void dfs(ll x){
flag[x]=1;
for(int i=head[x];i;i=edge[i].next){
ll u=edge[i].to;
if(flag[u]){
continue;
}
if(edge[i].val%2==0){
color[u]=color[x];
dfs(u);
}
else{
color[u]=!color[x];
dfs(u);
}
}
}
int main(){
scanf("%lld",&a);
for(int i=1;i<=a-1;i++){
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dfs(1);
for(int i=1;i<=a;i++){
printf("%lld\n",color[i]);
}
return 0;
}