-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMinimize subtree sum difference
75 lines (64 loc) · 2.04 KB
/
Minimize subtree sum difference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <bits/stdc++.h>
using namespace std;
/* DFS method to traverse through edges,
calculating subtree sum at each node and
updating the difference between subtrees */
void dfs(int u, int parent, int totalSum,
vector<int> edge[], int subtree[], int& res)
{
int sum = subtree[u];
/* loop for all neighbors except parent and
aggregate sum over all subtrees */
for (int i = 0; i < edge[u].size(); i++)
{
int v = edge[u][i];
if (v != parent)
{
dfs(v, u, totalSum, edge, subtree, res);
sum += subtree[v];
}
}
// store sum in current node's subtree index
subtree[u] = sum;
/* at one side subtree sum is 'sum' and other side
subtree sum is 'totalSum - sum' so their difference
will be totalSum - 2*sum, by which we'll update
res */
if (u != 0 && abs(totalSum - 2*sum) < res)
res = abs(totalSum - 2*sum);
}
// Method returns minimum subtree sum difference
int getMinSubtreeSumDifference(int vertex[],
int edges[][2], int N)
{
int totalSum = 0;
int subtree[N];
// Calculating total sum of tree and initializing
// subtree sum's by vertex values
for (int i = 0; i < N; i++)
{
subtree[i] = vertex[i];
totalSum += vertex[i];
}
// filling edge data structure
vector<int> edge[N];
for (int i = 0; i < N - 1; i++)
{
edge[edges[i][0]].push_back(edges[i][1]);
edge[edges[i][1]].push_back(edges[i][0]);
}
int res = INT_MAX;
// calling DFS method at node 0, with parent as -1
dfs(0, -1, totalSum, edge, subtree, res);
return res;
}
// Driver code to test above methods
int main()
{
int vertex[] = {4, 2, 1, 6, 3, 5, 2};
int edges[][2] = {{0, 1}, {0, 2}, {0, 3},
{2, 4}, {2, 5}, {3, 6}};
int N = sizeof(vertex) / sizeof(vertex[0]);
cout << getMinSubtreeSumDifference(vertex, edges, N);
return 0;
}