summaryrefslogtreecommitdiff
path: root/content/graph/centroid.cpp
diff options
context:
space:
mode:
authorGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 01:24:14 +0100
committerGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 01:24:14 +0100
commit98567ec798aa8ca2cfbcb85c774dd470f30e30d4 (patch)
tree5113d5cc24d1ad5f93810b6442ce584a36950dc8 /content/graph/centroid.cpp
parentad3856a6b766087df0036de0b556f4700a6498c9 (diff)
parent8d11c6c8213f46f0fa19826917c255edd5d43cb1 (diff)
mzuenni tests
Diffstat (limited to 'content/graph/centroid.cpp')
-rw-r--r--content/graph/centroid.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/content/graph/centroid.cpp b/content/graph/centroid.cpp
new file mode 100644
index 0000000..820945b
--- /dev/null
+++ b/content/graph/centroid.cpp
@@ -0,0 +1,21 @@
+vector<int> s;
+void dfs_sz(int v, int from = -1) {
+ s[v] = 1;
+ for (int u : adj[v]) if (u != from) {
+ dfs_sz(u, v);
+ s[v] += s[u];
+}}
+
+pair<int, int> dfs_cent(int v, int from, int n) {
+ for (int u : adj[v]) if (u != from) {
+ if (2 * s[u] == n) return {v, u};
+ if (2 * s[u] > n) return dfs_cent(u, v, n);
+ }
+ return {v, -1};
+}
+
+pair<int, int> find_centroid(int root = 0) {
+ s.resize(sz(adj));
+ dfs_sz(root);
+ return dfs_cent(root, -1, s[root]);
+}