summaryrefslogtreecommitdiff
path: root/graph/centroid.cpp
blob: d2855e27d3ec8673da5aae47eac256a9a6e0228a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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]);
}