algorithm - 将两色树转换为二分树
问题描述
给定一棵有两种颜色的树(比如红色和蓝色),我想通过交换相邻节点的颜色将其转换为二分树。我也想保持交换的数量最少。我无法处理最小交换部分。虽然我编写了一个 dfs 代码,假设 root 是红色并计算所需的红色和蓝色节点的数量。如果我们有足够的颜色来使树二分,我们如何计算最小交换?
void dfs(vector<vector<ll>> &adj , ll node , ll parent , ll val)
{
if(val == 0) red++;
else
{
blue++;
}
for(auto x : adj[node])
{
if(x!=parent)
dfs(adj , x , node , val^1 );
}
return;
}
if(givenred == red || givenred == blue)
// count minimal swaps
else
// not possible
解决方案
一旦你决定了哪些节点需要是哪种颜色,那么:
- 选择一个根,如果你还没有
- 对于每个子树,计算该子树中应该有多少个红色节点
- 对于每个子树,计算该子树中有多少个红色节点
- 将每个子树的差异幅度加起来。
对于每个子树,差异的大小是必须跨越边缘到其父树的交换次数。
该算法需要线性时间,因为每个步骤都可以使用 DFS 在线性时间内完成。您可以尝试两种颜色分配(根红色或根蓝色)并选择较小的总数。
推荐阅读
- xcode - 如何在 iOS 中使用缩放的 UI 内容?
- python - 有没有办法在 Plotly for Python 的条形图中突出显示(粗体)条形图的名称?
- javascript - 遍历 Javascript 中的字典列表
- python - Python Wand:如何使文本加粗?
- reactjs - 根据状态值动态添加类,并根据父状态更改更改子内容
- php - 如何在 laravel 中自定义分页以显示每个页面的多个元素
- mysql - 如何解析复合结构中的表
- python - pandas 使用列表理解创建新列
- performance - 通过删除已加载的 DOM 节点来提高性能?
- c++ - 为什么在 C++ 的类指针声明中使用 'struct' 关键字