Find the root of the sub-tree whose weighted sum XOR with X is minimum

Given a tree, and the weights of all the nodes, the task is to find the root of the sub-tree whose weighted sum XOR with given integer X is minimum.

Examples:

Input:

X = 15
Output: 5
Weight of sub-tree for parent 1 = ((-1) + (5) + (-2) + (-1) + (3)) XOR 15 = 4 XOR 15 = 11
Weight of sub-tree for parent 2 = ((5) + (-1) + (3)) XOR 15 = 7 XOR 15 = 8
Weight of sub-tree for parent 3 = -1 XOR 15 = -16
Weight of sub-tree for parent 4 = 3 XOR 15 = 12
Weight of sub-tree for parent 5 = -2 XOR 15 = -15
Node 3 gives the minimum sub-tree weighted sum XOR X.



Approach: Perform dfs on the tree, and for every node calculate the sub-tree weighted sum rooted at the current node then find the minimum (sum XOR X) value for a node.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
int ans = 0, mini = INT_MAX;
  
vector<int> graph[100];
vector<int> weight(100);
  
// Function to perform dfs and update the tree
// such that every node's weight is the sum of
// the weights of all the nodes in the sub-tree
// of the current node including itself
void dfs(int node, int parent)
{
    for (int to : graph[node]) {
        if (to == parent)
            continue;
        dfs(to, node);
  
        // Calculating the weighted
        // sum of the subtree
        weight[node] += weight[to];
    }
}
  
// Function to find the node
// having minimum sub-tree sum XOR x
void findMinX(int n, int x)
{
  
    // For every node
    for (int i = 1; i <= n; i++) {
  
        // If current node's weight XOR x
        // is minimum so far
        if (mini > (weight[i] ^ x)) {
            mini = (weight[i] ^ x);
            ans = i;
        }
    }
}
  
// Driver code
int main()
{
    int x = 15;
    int n = 5;
  
    // Weights of the node
    weight[1] = -1;
    weight[2] = 5;
    weight[3] = -1;
    weight[4] = 3;
    weight[5] = -2;
  
    // Edges of the tree
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[2].push_back(4);
    graph[1].push_back(5);
  
    dfs(1, 1);
    findMinX(n, x);
  
    cout << ans;
  
    return 0;
}

chevron_right


Output:

3


My Personal Notes arrow_drop_up

Data science |Machine learning|Programming facebook -https//wwwfacebookcom/profilephpid=100002787011326

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.