博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

文章目录

  • 问题描述
  • 问题分析
  • 解题思路
  • C代码

问题描述

描述:
你拿到了一棵树,请你给每个顶点染成红色或蓝色。
要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。
“周围”的定义:某点周围的点指通过邻边直接连接的点。
所谓树,即没有自环、重边和回路的无向连通图。

输入描述:
第一行一个正整数 n,代表树的顶点个数.。(1≤n≤100000)
接下来的 n-1 行,每行两个正整数 u 和 v,代表点 u 和点 v 有一条边连接。 (1≤u,v≤n)
保证输入的一定是一棵合法的树。

输出描述:
如果可以达成染色的要求,请输出一个长度为 n 的字符串,第 i 个字符代表第 i 个顶点的染色情况,‘B’ 代表蓝色,‘R’ 代表红色。(若有多种合法染色的方法,输出任意一种即可)
否则直接输出-1。

示例1:
输入:

4
1 2
2 3
3 4

输出:

RRBB
说明:
1为红点,它连接的边有只有一个红点:2
2为红点,它连接的边有只有一个红点:1
3为蓝点,它连接的边有只有一个蓝点:4
4为蓝点,它连接的边有只有一个蓝点:3

示例2:
输入:

4
1 2
1 3
1 4

输出:
-1
说明:
可以证明,无论怎么染色,都无法满足题目的要求。

问题分析

  • ①对于叶子节点,周围只有一个点就是它的父亲节点,题目要求每个点周围有且仅有一个红点/蓝点,所以叶子节点的颜色与其父亲节点的颜色一定是相同的
  • ②如果一个节点有多个叶子节点,那么整颗树是无法染色的,因为如果第一个叶子节点和父节点颜色都是R,根据题目要求第二个叶子节点应该是B,但是这样又不符合我们上面①分析的结果,所以如果一个节点有多个叶子节点,结果一定是 -1;

解题思路

  • 我们使用深度优先搜索【DFS】遍历一次树,标记叶子节点及其父节点同色,将标记的点去掉后就会有新的叶子节点,然后重复这步操作。

    • DFS遍历过程中,这个点若是叶子节点,将其与其父节点标记为同色,也就是赋予一个标记;
    • 这个点不是叶子节点但未与子树中任何点同色,标记它和它的父亲节点同色;
    • 如果同一个点被标记两次,则返回 -1;
    • 如果根节点没有被标记,返回 -1;
  • 再进行一次DFS,对节点上色。如果一个点与父亲节点标记相同,则颜色相同,如果标记不同,则颜色相反。

C代码

#include <stdio.h>
#include <string.h>int mark = 0;  //标记同色的父子节点
int head[100010]; // 存储树的索引节点
struct ty
{int value; // 边的值int next;  // 相邻边的索引
}edge[200010];int dp[100010]={0}; // 第一次DFS时,每个点的标记信息
int color[100010]={0}; // 第二次DFS时,记录每个节点的颜色信息/* 添加新的边到树型结构中 */
void addedge(int x, int y,int pos)
{edge[pos].value = y;edge[pos].next = head[x];head[x] = pos;
}int dfs1(int x,int father)
{int son=0;for(int i=head[x];i != -1;i = edge[i].next){if(edge[i].value != father) // 避免回环{++son;if(dfs1(edge[i].value,x)) return 1; }}// son==0表示叶子节点 ; dp[x]==0 表示 x 这个点未被标记if(son == 0 || dp[x]==0){if(dp[father] !=0) return 1; // 一个节点被多次标记,无解dp[x] = dp[father] = ++mark;}return 0;
}void dfs2(int x,int father)
{for(int i=head[x];i != -1;i = edge[i].next){if(edge[i].value != father) // 避免回环{if(dp[edge[i].value] == dp[x])color[edge[i].value] = color[x]; // 两个节点标记相同,则颜色相同elsecolor[edge[i].value] = !color[x]; // 两个节点标记不同,则颜色不同dfs2(edge[i].value, x);}}
}int main()
{int x,y,n,pos=1;scanf("%d",&n);memset(head, -1, sizeof(head));memset(edge, -1, sizeof(edge));for(int i=1;i<n;++i){scanf("%d%d",&x,&y);addedge(x, y,pos);++pos;addedge(y, x,pos);++pos;}// 1==dfs1(1,0) 表示无解// dp[0] 其实是整个树的第一个节点的根节点,上面的code中,我们的树是从pos==1开始的// 也就是第一个节点的标记信息在dp[1]中,这里使用dp[0]就是为了观察第一个节点(dp[1])有没有被孤立// 如果孤立了则dp[0]一定被标记了,反之dp[0]一定为0if(dfs1(1,0) || dp[0]){printf("-1");return 0;}color[1]=1; // 这里也可以是0,题目也说了可能多解dfs2(1,0);for(int i=1;i<=n;++i){printf("%c",color[i]?'R':'B');}return 0;
}

这里是从善若水的博客,感谢您的阅读

【随缘一练】一棵树,请你给每个顶点染成红色或蓝色相关推荐

  1. 请画出五个具有五个结点的无向图,使之分别满足: (1) 是欧拉图但不是汉密尔顿图。 (2) 既是欧拉图也是汉密尔顿图。 (3) 是完全图K5。 (4) 是棵树。 (5) 是汉

    请画出五个具有五个结点的无向图,使之分别满足: (1) 是欧拉图但不是汉密尔顿图. (2) 既是欧拉图也是汉密尔顿图.(3) 是完全图K5. (4) 是棵树. (5) 是汉密尔顿图但不是欧拉图 .

  2. python输出一棵松树_【ROSALIND】【练Python,学生信】32 构建一棵树

    题目: 构建一棵树(Completing a Tree) Given: A positive integer n (n≤1000) and an adjacency list correspondin ...

  3. 一棵树,怎么就平衡了(图解AVL+实现)

    什么是AVL树 大家好,我是bigsai,好久不见,甚是想念. 对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下. 在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排 ...

  4. 数据结构-判断一棵树是否为二叉排序树

    判断一棵树是否为二叉排序树 二叉排序树的性质:如果按照中序遍历的方式遍历二叉排序树的话,遍历的数字是呈递增趋势的.我们根据这个思路去判断是否为二叉排序树. 思路: ①建树 ②设立一个变量去记录当前已经 ...

  5. 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...

    阅读本文前,请您先点击上面的蓝色字体"总李谈车",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注.原创持续更新&quo ...

  6. 把树分成森林 matlab,20170106RF_Matlab 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,包括两个方面:数据的随 269万源代码下载- www.pudn.com...

    文件名称: 20170106RF_Matlab下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 441 KB 上传时间: 2017-01-06 下载次数: 0 ...

  7. 判断一棵树是否为完全二叉树的算法c语言_别再翻了,面试二叉树看这 11 个就够了!||CSDN博客精选...

    作者:一只不甘平凡的小鹿 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很 ...

  8. python画一棵树的心理测试_【心理测试】画树测试:一棵树读你的人生

    ★画树测试:一棵树读你的人生★? 心理导读:你会怎样随笔画一棵大树呢?这棵大树又折射出你怎样的秘密?在房树人心理测验的世界(HTP),树表现个体的精神及性的成熟性,是个体生命成长的历程的象征.你画怎样 ...

  9. c语言数组读心术,超准,一棵树的读心术

    原标题:超准,一棵树的读心术 木星在水瓶座的人重视平等的机会,这也是他们人生当中最重视的事情,发现不符合公平与公正的事情时会去质疑挑战. 今天,是太阳进入天蝎座的日子.首先,祝所有天蝎宝宝们生日快乐. ...

最新文章

  1. 【jquery】jquery基础知识
  2. GBDT 算法如何用于分类问题
  3. 笔试题——max pooling滑动窗口实现(python 代码)
  4. DELL本本 执行SQL语句要FN+F5 如何更改成F5
  5. vue/cli 3.0 与 2.0脚手架怎样mock数据
  6. JavaScript 常用函数
  7. nova8pro能升级鸿蒙吗,华为将有48款产品可以升级到鸿蒙 2.0系统
  8. php需要什么技能,PHP初学者必备的技能
  9. 完善三个数字对象排序程序。MOOC,Java第四章 面向对象和类 第一次作业
  10. Android 博文
  11. html代码不安全,安全 – HTML编码是否会阻止各种XSS攻击?
  12. Apache的目录结构详细讲解
  13. ZZULIOJ1026-1030Python解法
  14. ams1117 lm317 对比_三种典型的基于AMS1117稳压IC的5v转3.3v电路-电路图讲解-电子技术方案...
  15. dell 7040m 黑苹果_王者做图显示器,戴尔(DELL)U2417全面介绍
  16. Unity插件之EasyTouch和LeanTouch
  17. 161张Menhera酱表情包 无水印汉化版
  18. html采集电脑信息,网页数据采集入门词汇介绍 - 八爪鱼采集器
  19. 双向联想记忆网络的原理与python简单实现
  20. python量化交易第五章

热门文章

  1. 手机待机功耗测试软件,移动端相关功耗测试杂谈
  2. 怎么将图片旋转45度?
  3. 【youcans的OpenCV例程300篇】总目录
  4. ADB调试USB设备指南
  5. MSP430F5529 (六)定时器Timer_A
  6. 产业安全专家谈 | 银行业小程序安全防护的实践路径
  7. matlab虚线缺一截,Matlab如何将有缺口的圆补足
  8. nodejs企业级开发框架nest学习总结 - 1.NestJS入门controller、DTO、providers、module
  9. 惩罚性赔偿金是根据什么来定的
  10. SQL 为什么历经半个世纪却经久不衰?