当前位置: 首页 > article >正文

力扣3373.连接两棵树后最大目标节点数目II

力扣3373.连接两棵树后最大目标节点数目II

题目

在这里插入图片描述

题目解析及思路

题目要求对于第一棵树中每个节点,使其与第二棵树的一个节点连边,返回最多的目标节点数目

目标节点:距离为偶数

染色,从节点0开始递归求两棵树中黑白两色的节点数量

第二棵树中数量多的那个颜色为max2

第一棵树中同色 + max2为答案

代码

class Solution {
public:
    vector<int> maxTargetNodes(vector<vector<int>>& edges1, vector<vector<int>>& edges2) {
        // 计数辅助函数,统计图中每个节点的颜色(0 或 1)
        auto count = [](vector<vector<int>>& edges) {
            vector<vector<int>> g(edges.size() + 1);  // 创建邻接表
            // 将边插入到图的邻接表中
            for (auto& e : edges) {
                int x = e[0], y = e[1];
                g[x].push_back(y);  // 在 x 节点和 y 节点之间添加边
                g[y].push_back(x);  // 在 y 节点和 x 节点之间添加边
            }

            array<int, 2> cnt{};  // 用来统计颜色为 0 和 1 的节点数量
            // 深度优先搜索(DFS)函数,用来遍历图并计算节点的颜色
            auto dfs = [&](auto&& dfs, int x, int fa, int d) -> void {
                cnt[d]++;  // 记录当前节点颜色的数量
                for (int y : g[x]) {
                    if (y != fa) {  // 防止回到父节点
                        dfs(dfs, y, x, d ^ 1);  // 切换颜色,继续递归
                    }
                }
            };
            dfs(dfs, 0, -1, 0);  // 从节点 0 开始深度优先搜索,初始颜色为 0
            return make_pair(g, cnt);  // 返回图的邻接表和颜色计数
        };

        // 计算 edges2 图的节点颜色数量
        auto [_, cnt2] = count(edges2);
        int max2 = max(cnt2[0], cnt2[1]);  // 找到最大颜色数量

        // 计算 edges1 图的节点颜色数量
        auto [g, cnt1] = count(edges1);
        vector<int> ans(g.size(), max2);  // 初始化答案数组,大小为图的节点数,初始值为 max2

        // 深度优先搜索,计算每个节点的最大目标节点数量
        auto dfs = [&](auto&& dfs, int x, int fa, int d) -> void {
            ans[x] += cnt1[d];  // 根据颜色 d 更新当前节点的目标节点数量
            for (int y : g[x]) {
                if (y != fa) {  // 防止回到父节点
                    dfs(dfs, y, x, d ^ 1);  // 切换颜色,继续递归
                }
            }
        };
        dfs(dfs, 0, -1, 0);  // 从节点 0 开始深度优先搜索,初始颜色为 0

        return ans;  // 返回每个节点的最大目标节点数量
    }
};


http://www.kler.cn/a/418696.html

相关文章:

  • 联合汽车电子嵌入式面试题及参考答案
  • [Linux] 进程间通信——匿名管道命名管道
  • C-操作符
  • Mysql高可用架构方案
  • vulnhub靶场【哈利波特】三部曲之Fawkes
  • Zabbix 模板翻译自动化教程
  • 网页开发的http基础知识
  • Mysql实现定时自动备份(Windows环境)
  • 如何正确处理和解析 GitHub API 返回的 JSON 数据:详细指南与示例
  • 多线程相关案例
  • 文本内容处理命令和正则表达式
  • 使用springBoot的freemarker生成按模板生成word
  • pycharm(一)安装
  • electron学习 渲染进程与主进程通信
  • ArrayList和LinkedList的区别(详解)
  • Mybatis:CRUD数据操作之多条件查询及动态SQL
  • 基于RISC-V 的代理内核实验(使用ub虚拟机安装基本环境)
  • Vivado程序固化到Flash
  • 「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
  • 【VUE3】【Naive UI】<NCard> 标签
  • Redis 3 种特殊数据类型详解
  • 详解Qt 之QSwipeGesture手势滑动
  • unity中:Unity 中异步与协程结合实现线程阻塞的http数据请求
  • OGRE 3D----2. QGRE + QQuickView
  • 【博主推荐】C#中winfrom开发常用技术点收集
  • 如何在 Ubuntu 16.04 上使用 GitLab CI 设置持续集成流水线