summaryrefslogtreecommitdiff
path: root/graph/centroid.cpp
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
committermzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
commit5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch)
treeed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /graph/centroid.cpp
parentadabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff)
updated tcr
Diffstat (limited to 'graph/centroid.cpp')
-rw-r--r--graph/centroid.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/graph/centroid.cpp b/graph/centroid.cpp
new file mode 100644
index 0000000..d2855e2
--- /dev/null
+++ b/graph/centroid.cpp
@@ -0,0 +1,22 @@
+vector<int> s;
+void dfs1(int u, int v = -1) {
+ s[u] = 1;
+ for (int w : adj[u]) {
+ if (w == v) continue;
+ dfs1(w, u);
+ s[u] += s[w];
+}}
+
+pair<int, int> dfs2(int u, int v, int n) {
+ for (int w : adj[u]) {
+ if (2 * s[w] == n) return {u, w};
+ if (w != v && 2 * s[w] > n) return dfs2(w, u, n);
+ }
+ return {u, -1};
+}
+
+pair<int, int> find_centroid(int root) {
+ // s muss nicht initialisiert werden, nur groß genug sein
+ dfs1(root);
+ return dfs2(root, -1, s[root]);
+}