给定一棵两色树(例如红色和蓝色),我想通过交换相邻节点的颜色将其转换为二叉树。 我也想保持掉期数最小。我无法处理最小交换部分。 尽管我已经编写了一个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
答案 0 :(得分:0)
一旦确定了哪些节点需要为哪种颜色,则:
对于每个子树,差异的大小是必须跨越边缘与其父节点进行交换的次数。
该算法占用线性时间,因为每个步骤都可以使用DFS在线性时间内完成。您可以尝试两种颜色分配(根红色或根蓝色),然后选择较小的颜色。