题意

给出两棵树,要求给两棵树上相同编号的点赋值,使得每个点的子树权值和的绝对值为1

做法

如果某个编号代表的点在一棵树中的儿子数为奇数而在另一棵树中的儿子数为偶数,那么无论这个位置填什么都不可能,否则可以构造只填0,1,-1的方案。具体做法是,分别考虑两棵树,如果一个点的儿子数为奇数,那么这个点填0;否则对于这个点所在的子树里的奇数儿子点两两配对,表示一个填1另一个填-1。把两棵树的配对情况一起建图,最后得到的必然是二分图,因为任何一个环上的边必然是交替来自两棵树内的配对。故而二染色填数即可。

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 100;int n, fa[N], fb[N], is_odd[2][N];struct Edge {int e, *h, *nx, *to, V, E;Edge(int V, int E):V(V), E(E) {e = 0;h = new int [V];nx = new int [E];to = new int [E];memset(h, -1, 4 * V);}~Edge() {delete h;delete nx;delete to;}void clear() {e = 0;memset(h, -1, 4 * V);}void add(int u, int v) {to[e] = v, nx[e] = h[u], h[u] = e++;to[e] = u, nx[e] = h[v], h[v] = e++;}
} *tr, *bi;int dfs(int u, int f) {vector<int> odd_son;for (int i = tr->h[u]; i != -1; i = tr->nx[i]) {int v = tr->to[i];if (v != f) {v = dfs(v, u);if (v != 0)odd_son.push_back(v);}}if (!is_odd[0][u])odd_son.push_back(u);for (int i = 0; i < (int)odd_son.size() - 1; i += 2) {bi->add(odd_son[i], odd_son[i + 1]);}return odd_son.size() % 2 == 0 ? 0 : odd_son.back();
}bool vis[N], col[N];void coloring(int u, int c) {vis[u] = true;col[u] = c;for (int i = bi->h[u]; i != -1; i = bi->nx[i]) {int v = bi->to[i];if (!vis[v])coloring(v, c ^ 1);}
}int main() {
#ifdef lolfreopen("f.in", "r", stdin);freopen("f.out", "w", stdout);
#endifscanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%d", &fa[i]);if (fa[i] != -1) {is_odd[0][fa[i]] ^= 1;}}for (int i = 1; i <= n; ++i) {scanf("%d", &fb[i]);if (fb[i] != -1)is_odd[1][fb[i]] ^= 1;}for (int i = 1; i <= n; ++i) {if (is_odd[0][i] ^ is_odd[1][i]) {puts("IMPOSSIBLE");return 0;}}tr = new Edge(n + 1, (n + 1) * 2);bi = new Edge(n + 10, (n + 10) * 4);int rt;for (int i = 1; i <= n; ++i) {if (fa[i] == -1) {rt = i;continue;}tr->add(i, fa[i]);}dfs(rt, -1);tr->clear();for (int i = 1; i <= n; ++i) {if (fb[i] == -1) {rt = i;continue;}tr->add(i, fb[i]);}dfs(rt, -1);for (int i = 1; i <= n; ++i)if (!vis[i]) {coloring(i, 1);}puts("POSSIBLE");for (int i = 1; i <= n; ++i) {if (is_odd[0][i]) {printf("%d ", 0);} else {printf("%d ", col[i] ? 1 : -1);}}puts("");return 0;
}

转载于:https://www.cnblogs.com/ichn/p/7580120.html

AGC018F. Two Trees相关推荐

  1. AT2675 [AGC018F] Two Trees(欧拉回路)

    AT2675 [AGC018F] Two Trees 首先我们看到1或-1,那么就是限制差距在1以内,然后我们可以想到构造一些东西来满足这种东西,然后我们经常利用的就是欧拉回路. 首先这是两个树,然后 ...

  2. [AGC018F] Two Trees

    Two Trees 题解 首先,我们要说明一点,如果该题有解,那么我们用{−1,0,1}\{-1,0,1\}{−1,0,1}一定可以构造出一组解. 其实很容易理解的 对于一个点,它的权值有它儿子的个数 ...

  3. AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集)

    description 戳我看题目 solution 正解说是欧拉回路,但是于私而言非常难懂,如果有兴趣可以看香香mm的博客 定义一个点如果有偶数个儿子,就为奇点:如果有奇数个儿子,就为偶点 对于一个 ...

  4. UVA122 树的层次遍历 Trees on the level(两种方法详解)

    UVA122 树的层次遍历 Trees on the level 输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ...

  5. 多元回归树分析Multivariate Regression Trees,MRT

    作者:陈亮 单位:中国科学院微生物研究所 多元回归树分析 多元回归树(Multivariate Regression Trees,MRT)是单元回归树的拓展,是一种对一系列连续型变量递归划分成多个类群 ...

  6. R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

    R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees).使用plot函数可视化训练好的条件推理决策树.条件推理决策树的叶子节点的阴影区域表 ...

  7. R语言构建决策树(decision trees)模型并进行调优和解释

    R语言构建决策树(decision trees)模型并进行调优和解释 目录 R语言构建决策树(decision trees)

  8. 人脸对齐--One Millisecond Face Alignment with an Ensemble of Regression Trees

    One Millisecond Face Alignment with an Ensemble of Regression Trees CVPR2014 http://www.csc.kth.se/~ ...

  9. hdu1693Eat the Trees(插头dp)

    传送门 先坑着,等啥时候会了再来填坑 不得不说思路真的是很妙啊 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 # ...

最新文章

  1. 深入理解lombok
  2. 深入理解javascript原型和闭包(9)——简述【执行上下文】下
  3. fckeditor2.63 上传图片的一个问题的解决办法
  4. CentOS 8 正式发布
  5. 《UNIXLinux程序设计教程》一2.1 UNIX 输入输出基本概念
  6. 质数因子 java_质数因子
  7. Hive建表与数据加载
  8. requests之json系列(一)
  9. 洛谷OJ - P1156 - 垃圾陷阱
  10. 华为认证 HCNA­Cloud 云计算题库
  11. Android8.0.0的BUG Only fullscreen opaque activities can request orientation
  12. 互联网晚报 | 7月16日 星期六 |抖音回应“外卖功能上线”;上半年国内生产总值同比增长2.5%;雷军8月将携小米工程样车亮相...
  13. 微信公众号基础入门知识
  14. vue实现文字翻转效果
  15. IP和网段的计算方法
  16. 70个经典的 Shell 脚本
  17. Robocup3D第一次笔记
  18. 计算机表格数字整体加,excel表格整体数据加1怎么处理-怎样才可以在EXCEL表格的数字中全部加1??...
  19. USACO4.1 篱笆回路Fence Loops
  20. wxPython:一曲MFC时代的挽歌,更是理想主义的绝唱

热门文章

  1. arraylist转int数组_深度剖析Java集合之ArrayList
  2. c#里面的combobox在代码中怎么根据它的text获取它的index?
  3. 修复linux bash破壳漏洞,Linux系统下如何检测并修复bash中的破壳漏洞​​
  4. ionic2 问题整理汇总
  5. 一种可以解决python读取文件中文出乱码的方法
  6. Autofac在项目中应用的体会,一个接口多个实现的情况
  7. 日志对于运维的重要性
  8. 今天开始写一些内容,留作备份。
  9. 附录:保护模式下的各个“对象”
  10. 8.3、Spring Profiles 功能及内部原理