前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >codeforces 429A(dfs)

codeforces 429A(dfs)

作者头像
dejavu1zz
发布2020-10-23 15:19:34
3660
发布2020-10-23 15:19:34
举报
文章被收录于专栏:奇妙的算法世界

题意描述

给定一棵树,树的每个结点上有一个值,你可以对树上的值进行异或操作,求使树上的结点值成为目标值所需的最少操作

思路

我们可以发现,如果第一次是对奇数层进行操作,那么第二次再对偶数层进行操作时,上一步的操作就会作废。发现这个性质后,就可以dfs求解。如果需要翻转奇数层,则之前偶数层的操作将作废;如果需要反转偶数层,则之前奇数层的操作将作废。这样的话只需要dfs一次就可以求出解

AC代码

代码语言:javascript
复制
#include<bits/stdc++.h>
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<long,long> PLL;
typedef pair<char,char> PCC;
typedef long long LL;
const int N=3*1e5+10;
const int M=150;
const int INF=0x3f3f3f3f;
const int MOD=998244353;
int n,init[N],goal[N];
vector<int> g[N];
vector<int> ans;
void dfs(int node,int father,int state,int odd,int even){
    if((state && odd) || (!state && even)) init[node]^=1;

    if(init[node]!=goal[node]){
        ans.push_back(node);
        if(state) odd^=1;
        else even^=1;
    }

    for(int i=0;i<g[node].size();i++){
        if(g[node][i]==father) continue;
        dfs(g[node][i],node,(state+1)%2,odd,even);
    }
}
void solve(){
    cin>>n;
    for(int i=0;i<n-1;i++){
        int x,y;cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++) cin>>init[i];
    for(int i=1;i<=n;i++) cin>>goal[i];
    dfs(1,-1,1,0,0);
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl;
}
int main(){
    IOS;
    solve();
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意描述
  • 思路
  • AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档