当前位置:网站首页>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;
}
};
边栏推荐
- Cut point of undirected graph
- Inversion de l'intervalle spécifié dans la liste des liens
- Deep analysis of data storage in memory
- The R language uses the ctree function in the party package to build conditional inference decision trees, uses the plot function to visualize the trained conditional inference decision tree, and the
- 信息熵的基础
- Linear programming of mathematical modeling (including Matlab code)
- 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
- 链表中的节点每k个一组翻转
- Solve the cache problem of reactnative using WebView
- [AUTOSAR XIII NVM]
猜你喜欢
Advanced pointer (I)
数据分析思维分析犯法和业务知识——分析方法(一)
Trois tâches principales: asynchrone, courrier et timing
Niu Ke swipes questions and clocks in
Basic remote connection tool xshell
正确甄别API、REST API、RESTful API和Web Service之间的异同
How to convert Quanzhi a40i/t3 to can through SPI
Test shift right: Elk practice of online quality monitoring
[overview of AUTOSAR three RTE]
Cut point of undirected graph
随机推荐
【FH-GFSK】FH-GFSK信号分析与盲解调研究
Strongly connected components of digraph
异步、郵件、定時三大任務
Delete duplicate elements in the ordered linked list -ii
解决ReactNative使用webView存在缓存问题
研发一款国产ARM智能边缘计算网关需要什么
MySQL multi table joint deletion
[shutter] image component (configure local GIF image resources | load placeholder with local resources)
链表内指定区间反转
Daily topic: movement of haystack
1696C. Fishingprince Plays With Array【思维题 + 中间状态 + 优化存储】
无向图的割点
excel IF公式判断两列是否相同
2022.2.14 resumption
1696C. Fishingprince plays with array [thinking questions + intermediate state + optimized storage]
The difference between tail -f, tail -f and tail
Matlab finds the position of a row or column in the matrix
[flutter] icons component (fluttericon Download Icon | customize SVG icon to generate TTF font file | use the downloaded TTF icon file)
Every k nodes in the linked list are flipped
matlab 多普勒效应产生振动信号和处理