当前位置:网站首页>leetcode 6103 — 从树中删除边的最小分数
leetcode 6103 — 从树中删除边的最小分数
2022-07-03 00:51:00 【coding-hwz】
一、题目描述

二、思路
如果我们删除两条边,那么可以分为两种情况讨论:
1、四个节点在从根节点到某个叶节点的一条路径上;
2、四个节点分别在从根节点到两个叶节点的路径上。
我们不妨设两条边的第一条边的节点为 min1,max1( m i n 1 深 度 < m a x 1 深 度 min1深度 < max1深度 min1深度<max1深度);第二条边的节点为 min2,max2( m i n 2 深 度 < m a x 2 深 度 min2深度 < max2深度 min2深度<max2深度)。
针对第一种情况,假设 m a x 1 深 度 < m a x 2 深 度 max1深度 < max2深度 max1深度<max2深度,不难发现三个连通域分别为 max2 的子树,max1 的子树中去除 max2 的子树以及剩余部分。
针对第二种情况,三个连通域分别 max2 的子树,max1 的子树以及剩余部分。
那么由于求的是异或,只要我们知道任意两个连通域的异或结果和总的异或结果就可以知道第三个连通域的异或。而上述异或可以通过所有节点的子树异或得到,即一次 dfs。
三、实现
1、节点时间戳
这道题困扰我的就是如何判断要删除的两条边属于情况1还是情况2。其实这个问题类似寻找两个节点的公共祖先节点。但是如果针对每种边的组合都进行一次查找,复杂度会比较高。看了网上的解答,我学习到了可以借助时间戳的概念来实现。
针对每个节点,记录一个 in,out 数组,分别用于记录访问该节点的开始时间和结束时间。在 dfs 的过程中,每当访问某个节点时,将当前时间赋值给 in 数组并递增当前时间;每当结束某个节点的 dfs 时,将当前时间赋值给 out 数组。
注意这里的 in,out 数组同样可以用来判断同一分支上的相对深度。
2、实现
class Solution {
public:
int minimumScore(vector<int>& nums, vector<vector<int>>& edges) {
int n = nums.size(), e = edges.size();
vector<vector<int>> edgesWithNode(n);
for (int i = 0; i < e; ++i) {
edgesWithNode[edges[i][0]].push_back(edges[i][1]);
edgesWithNode[edges[i][1]].push_back(edges[i][0]);
}
vector<int> xorsChildren(n, -1);
vector<bool> visited(n);
vector<int> in(n), out(n);
int clock = 0;
function<void(int)> dfs = [&](int index) {
visited[index] = true;
in[index] = clock++;
xorsChildren[index] = nums[index];
for (auto next : edgesWithNode[index]) {
if (!visited[next]) {
dfs(next);
xorsChildren[index] = xorsChildren[next] ^ xorsChildren[index];
}
}
out[index] = clock;
};
dfs(0);
int total = xorsChildren[0];
int ret = INT_MAX;
for (int i = 0; i < e; ++i) {
for (int j = i + 1; j < e; ++j) {
vector<int> curXors(3);
int max1 = in[edges[i][0]] > in[edges[i][1]] ? edges[i][0] : edges[i][1];
int max2 = in[edges[j][0]] > in[edges[j][1]] ? edges[j][0] : edges[j][1];
int min1 = max1 == edges[i][0] ? edges[i][1] : edges[i][0];
int min2 = max2 == edges[j][0] ? edges[j][1] : edges[j][0];
int low = in[max1] > in[max2] ? max1 : max2;
int high = low == max1 ? max2 : max1;
bool sameLine = in[high] <= in[low] && out[low] <= out[high];
if (!sameLine) {
curXors[0] = xorsChildren[max1];
curXors[1] = xorsChildren[max2];
}
else {
if (in[max1] >= in[max2]) {
curXors[0] = xorsChildren[max1];
curXors[1] = xorsChildren[max2];
curXors[1] ^= curXors[0];
}
else {
curXors[0] = xorsChildren[max1];
curXors[1] = xorsChildren[max2];
curXors[0] ^= curXors[1];
}
}
curXors[2] = total ^ curXors[0] ^ curXors[1];
int score = max({
curXors[0], curXors[1], curXors[2] }) - min({
curXors[0], curXors[1], curXors[2] });
ret = min(ret, score);
}
}
return ret;
}
};

边栏推荐
- Rk3568 development board evaluation (II): development environment construction
- The difference between tail -f, tail -f and tail
- [自我管理]时间、精力与习惯管理
- 研发一款国产ARM智能边缘计算网关需要什么
- 12_ Implementation of rolling automatic video playback effect of wechat video number of wechat applet
- Advanced pointer (I)
- [AUTOSAR nine c/s principle Architecture]
- 链表内指定区间反转
- 1696C. Fishingprince plays with array [thinking questions + intermediate state + optimized storage]
- Matlab saves the digital matrix as geospatial data, and the display subscript index must be of positive integer type or logical type. Solve the problem
猜你喜欢

正确甄别API、REST API、RESTful API和Web Service之间的异同
![[Arduino experiment 17 L298N motor drive module]](/img/e2/4511eaa942e4a64c8ca2ee70162785.jpg)
[Arduino experiment 17 L298N motor drive module]

matlab将数字矩阵保存为地理空间数据出错,显示下标索引必须为正整数类型或逻辑类型,解决

Advanced pointer (I)

excel IF公式判断两列是否相同

有向图的强连通分量

Leetcode-2280: represents the minimum number of line segments of a line graph
[AUTOSAR five methodology]

Draw love with go+ to express love to her beloved
![[AUTOSAR eight OS]](/img/ac/fbc84c077ff9c94c840e1871171d19.png)
[AUTOSAR eight OS]
随机推荐
Deep analysis of data storage in memory
链表中的节点每k个一组翻转
无向图的割点
【FPGA教程案例5】基于vivado核的ROM设计与实现
详解RDD基本概念、RDD五大属性
MySQL basics 03 introduction to MySQL types
信息熵的基础
FPGA - 7系列 FPGA内部结构之Clocking -04- 多区域时钟
全志A40i/T3如何通过SPI转CAN
鏈錶內指定區間反轉
excel IF公式判断两列是否相同
Reading and writing speed of Reza rz/g2l arm development board storage and network measurement
按键精灵打怪学习-多线程后台坐标识别
Button wizard play strange learning - go back to the city to buy medicine and add blood
R language uses coin package to apply permutation tests to independence problems (permutation tests, whether response variables are independent of groups, are two numerical variables independent, and
MySQL multi table joint deletion
删除有序链表中重复的元素-II
Several cases of recursive processing organization
每日一题之干草堆的移动
Usage of using clause in kingbases alter table