cpp: add «834. Sum of Distances in Tree»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
4b43fceae9
commit
241e5f9aad
1 changed files with 66 additions and 0 deletions
66
cpp/sum-of-distances-in-tree.cpp
Normal file
66
cpp/sum-of-distances-in-tree.cpp
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
using graph_t = std::unordered_map<int, std::vector<int>>;
|
||||||
|
|
||||||
|
graph_t make_graph(const std::vector<std::vector<int>> &edges) {
|
||||||
|
graph_t g;
|
||||||
|
|
||||||
|
for (const auto &e : edges) {
|
||||||
|
auto [u, v] = std::make_pair(e[0], e[1]);
|
||||||
|
|
||||||
|
g[u].push_back(v);
|
||||||
|
g[v].push_back(u);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct state {
|
||||||
|
int n;
|
||||||
|
std::vector<int> count;
|
||||||
|
std::vector<int> total;
|
||||||
|
|
||||||
|
state(int n) : n(n), count(n), total(n) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void dfs_sub(graph_t &g, state &s, int u, int parent) {
|
||||||
|
s.count[u] = 1;
|
||||||
|
|
||||||
|
for (auto v : g[u]) {
|
||||||
|
if (v == parent) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dfs_sub(g, s, v, u);
|
||||||
|
s.count[u] += s.count[v];
|
||||||
|
s.total[u] += s.total[v] + s.count[v];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dfs(graph_t &g, state &s, int u, int parent) {
|
||||||
|
for (auto v : g[u]) {
|
||||||
|
if (v == parent) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.total[v] = s.total[u] - 2 * s.count[v] + s.n;
|
||||||
|
dfs(g, s, v, u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
struct Solution {
|
||||||
|
std::vector<int>
|
||||||
|
sumOfDistancesInTree(int n, const std::vector<std::vector<int>> &edges) {
|
||||||
|
state s(n);
|
||||||
|
|
||||||
|
auto g = make_graph(edges);
|
||||||
|
dfs_sub(g, s, 0, -1);
|
||||||
|
dfs(g, s, 0, -1);
|
||||||
|
|
||||||
|
return s.total;
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in a new issue