将两色树转换为二叉树

时间:2020-08-23 16:51:46

标签: algorithm data-structures tree bipartite

给定一棵两色树(例如红色和蓝色),我想通过交换相邻节点的颜色将其转换为二叉树。 我也想保持掉期数最小。我无法处理最小交换部分。 尽管我已经编写了一个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

1 个答案:

答案 0 :(得分:0)

一旦确定了哪些节点需要为哪种颜色,则:

  1. 如果没有,请摘根
  2. 对于每个子树,计算该子树中应该有多少个红色节点
  3. 对于每个子树,计算该子树中有多少个红色节点
  4. 将每个子树的差异量相加。

对于每个子树,差异的大小是必须跨越边缘与其父节点进行交换的次数。

该算法占用线性时间,因为每个步骤都可以使用DFS在线性时间内完成。您可以尝试两种颜色分配(根红色或根蓝色),然后选择较小的颜色。

相关问题