题解 | #红和蓝#

红和蓝

http://www.nowcoder.com/practice/34bf2aaeb61f47be980b9ec0ab238c36

题目的主要信息:

  • 一棵无向树,给每个顶点染成红色或蓝色
  • 每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点
  • 无法完成染色输出-1,完成染色输出每个结点的颜色

具体做法:

首先叶子结点因为只与父亲结点相连,所以叶子结点与父亲结点同色,因此我们可以利用dfs从根节点开始递归遍历树,从叶子结点开始检测染色,将叶子结点与父结点染成同色,然后往上,如果遇到两个相邻结点都没有颜色,就染成同一色,否则不染色,这里我们可以用dp数组连上结点号表示。

遍历dp数组,如果每个结点都有颜色(即dp数组中都有值不为0),说明能够染色,否则就是不可以成功染色。

最后再次dfs,起点染色为红色,数组元素设置为1,遇到dp数组中相邻相同的点就染成相同的颜色,否则就设置为另一色(蓝色数组元素设置为0)

alt

#include<iostream>
#include<vector>
using namespace std;

vector<int> G[100001];
int dp[100001];
int color[100010];

void dfs1(int cur, int pre){
    for(int i = 0; i < G[cur].size(); i++){ //遍历所有子节点
        int next = G[cur][i];
        if(next == pre) //不能进入父节点
            continue;
        dfs1(next, cur); //进入子树
        if(!dp[cur] && !dp[next]){ //从叶子开始,叶子和父节点同色,依次往上
            dp[cur] = next;
            dp[next] = cur;
        }
    }
}

void dfs2(int cur, int pre){
    for(int i = 0; i < G[cur].size(); i++){
        int next = G[cur][i];
        if(next == pre) //不能进入父节点
            continue;
        color[next] = dp[cur] == next ? color[cur] : !color[cur]; //根据邻近的染色信息染色
        dfs2(next, cur);
    }
}

int main(){
    int n;
    cin >> n;
    for(int i = 1; i < n; i++){
        int u, v;
        cin >> u >> v;
        G[u].push_back(v); //构建邻接表
        G[v].push_back(u);
    }
    dfs1(1, -1); //第一次dfs尝试能否完成染色
    for(int i = 1; i < n; i++){ //检查是否每个结点都有颜色
        if(dp[i] <= 0){
            cout << -1 << endl;
            return 0;
        }
    }
    color[1] = 1; //第一个结点先染红色
    dfs2(1, -1); //第二次dfs给每个节点确定颜色
    for(int i = 1; i <= n; i++) //根据每个结点的01值输出颜色
        cout << (color[i] ? 'R' : 'B'); 
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),两次dfs都是单独遍历整棵树每个结点
  • 空间复杂度:O(n)O(n),dp数组邻接表和染色数组大小都为O(n)O(n)
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
简明扼要!
点赞 回复 分享
发布于 2021-11-01 21:15

相关推荐

1、自我介绍2、Agent项目是实习项目还是个人项目?有没有上线?3、拷打实习(10min)4、大模型微调,你的训练数据集是如何构建的?数据量有多大?5、在构建数据集的过程中,遇到了哪些挑战?花了多长时间?6、你之前的实习经历偏后端工程,你未来的职业规划更倾向于纯后端开发,还是希望从事与AI/大模型结合的工作?7、详细讲一下Golang中Channel的概念和作用,它是否是并发安全的?8、Channel和传统的锁(Mutex)在实现并发控制时有什么区别?各自的适用场景是什么?9、讲一下GMP模型10、当P的本地队列为空或者不为空时,它会怎么去调度G(协程)?11、Redis支持哪些数据结构12、为什么Redis的速度这么快13、如何实现一个类似淘宝搜索框的实时商品名称模糊搜索功能?14、实时输入联想与输入完成后点击搜索在技术实现上有什么本质区别?15、实时搜索通常使用什么网络协议(如WebSocket)?你了解或有使用过吗?讲一下16、请详细说明微信扫码登录的完整流程和背后发生的原理17、在微服务架构中,服务发现和负载均衡是如何实现的?18、服务注册中心(如Nacos,&nbsp;Consul)是如何工作的?服务实例如何注册和保活(如通过心跳机制)?19、讲一下Agent中的“长短期记忆”20、什么样的信息应该放在长期记忆,什么样的信息放在短期记忆?21、当对话轮数很多,上下文窗口不足时,有哪些处理策略?(如截断、压缩)22、如果要进行记忆压缩,通常有哪些方法?23、了解过Agent的设计范式吗?有哪些?24、你设计的Agent是怎么实现ReAct模式的?详细讲讲25、手撕:实现一个并发任务处理器:给定一个包含100个任务ID的列表,要求控制最大并发数为3,模拟并发调用某个外部接口(如打印ID)26、反问
三本咋了:很好的面筋
查看24道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务