[ABC126D] Even Relation 題解

PerchLootie發表於2024-06-07

題意

對一棵有 $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;
}

相關文章