首页 > 其他分享 >LeetCode 136场双周赛 Q4. 标记所有节点需要的时间

LeetCode 136场双周赛 Q4. 标记所有节点需要的时间

时间:2024-08-04 23:17:19浏览次数:10  
标签:cnt Q4 int pos 双周 节点 136 son mx

这道题也是一道比较经典的树形dp模板题;太久没写了,赛时一眼就想到了,但是敲的时候摸索了半天,还是没敲出来;

首先看题目,需要求出 无向树上从每个节点为树根节点到其他所有节点中最长路径的值,然后每条边的距离其实就是,如果目的地是奇数距离为1,目的地是偶数距离为2
那么这个逻辑很简单,其实如果需要计算以A为树根到所有子节点的最长路径,其实就是求A下面的所有子树的最长路径 + 根节点到子节点的距离,那么其实就可以用递归的方式去做,将计算规模层层缩小,最后统计

那么简单来说就是树上向下搜索,加维护一下当前节点到所有子树中路径的前2大,为什么需要维护前二大,原因是题目需要计算每个节点的数据,那么需要前二大做优化
其实就是当统计完第一个根节点时,其实其他节点,只剩下它的父节点当时未统计,那么当我们需要拿到父节点的最大值时,不能把自己给重复统计进去,所以需要做判断,这里判断的逻辑是如果父节点最大的路径就是我自己的,那么就取第二大,否则取最大路径。,具体看代码吧

class Solution {
public:
    const static int maxn = 1e5 + 10;
    vector<int> v[maxn];
    int cnt[maxn][2];
    vector<int> timeTaken(vector<vector<int>>& edges) {
        for (int i = 0; i < maxn; ++ i) {
            v[i].clear();
        }

        for (int i = 0; i < edges.size(); ++ i) {
            int x = edges[i][0];
            int y = edges[i][1];

            v[x].push_back(y);
            v[y].push_back(x);
        }

        dfs(0, 0);
        dfs1(0, 0);

        vector<int> ans;
        ans.clear();
        for (int i = 0; i <= edges.size(); ++ i) {
            ans.push_back(cnt[i][0]);
        }
        return ans;
    }

    void dfs(int pos, int fa) {
        cnt[pos][0] = 0;
        cnt[pos][1] = 0;

        for (int i = 0; i < v[pos].size(); ++ i) {
            int son = v[pos][i];
            if (son == fa) {
                continue;
            }

            dfs(son, pos);
            int mx = cnt[son][0];
            if (son % 2 == 0) mx += 2;
            else mx += 1;
            if (mx >= cnt[pos][0]) {
                cnt[pos][1] = cnt[pos][0];
                cnt[pos][0] = mx;
            } else if (mx > cnt[pos][1]) {
                cnt[pos][1] = mx;
            }
        }
    }

    void dfs1(int pos, int fa) {
        for (int i = 0; i < v[pos].size(); ++ i) {
            int son = v[pos][i];
            if (son == fa) {
                continue;
            }

            int fa_mx = cnt[pos][0];
            int self_mx = cnt[son][0];
            if (son % 2 == 0) self_mx += 2;
            else self_mx ++;
            if (fa_mx == self_mx) {
                fa_mx = cnt[pos][1];
            }

            if (pos % 2 == 0) fa_mx += 2;
            else fa_mx ++;
            if (fa_mx >= cnt[son][0]) {
                cnt[son][1] = cnt[son][0];
                cnt[son][0] = fa_mx;
            } else if (fa_mx > cnt[son][1]) {
                cnt[son][1] = fa_mx;
            }

            dfs1(son, pos);
        }
    }
};

标签:cnt,Q4,int,pos,双周,节点,136,son,mx
From: https://www.cnblogs.com/wanshe-li/p/18342402

相关文章

  • KubeSphere 社区双周报| 2024.07.19-08.01
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.07.19-08.01。贡献者名单新晋KubeSpherecontribu......
  • Leetcode 第 135 场双周赛题解
    Leetcode第135场双周赛题解Leetcode第135场双周赛题解题目1:3222.求出硬币游戏的赢家思路代码复杂度分析题目2:3223.操作后字符串的最短长度思路代码复杂度分析题目3:3224.使差值相等的最少数组改动次数思路代码复杂度分析题目4:思路代码复杂度分析Leetcode......
  • 【前端】JavaScript入门及实战136-140
    文章目录136类的操作137二级菜单138JSON139JSON140json2.js136类的操作<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><styletype="text/css"> .b1{ width:100px; height:100p......
  • DP1363F&DP1332E-13.56MHz电动车NFC刷卡解锁应用
    随着电动车市场的快速发展,车主对车辆的智能化和便捷性的要求也在不断提升。仪表盘作为电动车的重要组成部分,不仅需要提供基本的行驶信息,还需要具备智能交互功能。基于13.56MHz频率的NFC(近场通信)技术为电动车仪表盘的智能化提供了有效解决方案。本文将介绍一种基于13.56MHz的电动......
  • 18 双周迭代模式(3)
            前面几篇了解了敏捷开发的实践以及敏捷迭代管理,Scrum敏捷中,建议是2~4周一个迭代周期,较为广泛应用的是双周迭代模式,即两周完成一个迭代周期,一个迭代周期是指,软件开发到上线的时间。        在研发人员还在开发当前迭代的功能时,产品经理就规划好下一个迭......
  • Ryujinx(Switch模拟器) v1.1.1361 汉化版
    Ryujinx是一款免费、开源的NintendoSwitch模拟器,它可以在电脑上模拟NintendoSwitch游戏机的运行环境,让玩家们能够在PC上畅玩Switch游戏。Ryujinx支持大部分NintendoSwitch游戏,包括TheLegendofZelda:BreathoftheWild、SuperMarioOdyssey等知名游戏,而且还......
  • az-104 examtopics Topic 3 Q21-Q40
    Q21ExamAZ-104topic3question21discussion-ExamTopicsYouhaveanAzuresubscriptionnamedSubscription1thatcontainstheresourcesshowninthefollowingtable.Name,Type,Location,ResourcegroupRG1,Resourcegroup,WestUS,NotapplicableRG2,Re......
  • iOS开发基础136-防暴力点击
    要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤:第一步:引入Aspects库首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,允许你在运行时拦截类的实......
  • SSM小说阅读网站-计算机毕业设计源码11362
    摘 要本文介绍了一个基于SSM框架和MySQL数据库的小说阅读网站的设计与实现。该网站旨在为用户提供一个方便、舒适的在线小说阅读平台。该小说阅读网站具有以下主要功能:用户注册与登录、小说分类浏览、小说搜索、阅读历史记录、小说畅听等。通过该网站,用户可以根据自己的兴......
  • KubeSphere 社区双周报|07.05-07.18
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.07.05-07.18。贡献者名单新晋KubeSpherecontribu......