diff options
| author | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
|---|---|---|
| committer | mzuenni <michi.zuendorf@gmail.com> | 2022-06-27 17:19:28 +0200 |
| commit | 5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch) | |
| tree | ed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /graph/centroid.cpp | |
| parent | adabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff) | |
updated tcr
Diffstat (limited to 'graph/centroid.cpp')
| -rw-r--r-- | graph/centroid.cpp | 22 |
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]); +} |
