-
[3584] 가장 가까운 공통 조상BOJ 2022. 4. 15. 15:59
https://www.acmicpc.net/problem/3584
3584번: 가장 가까운 공통 조상
루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두
www.acmicpc.net
루트만 찾아서 lca로 구했다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;constexpr int MAX = 14;int n, p[10005][MAX], d[10005], dg[10005];vector<int> adj[10005];void dfs(int cur) {for (int nxt : adj[cur]) {if (d[nxt] != -1) continue;d[nxt] = d[cur] + 1;p[nxt][0] = cur;dfs(nxt);}}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);int t;cin >> t;while (t--) {int i, j;cin >> n;for (i = 1; i <= n; i++) adj[i].clear();memset(dg, 0, sizeof(dg));for (i = 0; i < n - 1; i++) {int a, b;cin >> a >> b;adj[a].push_back(b);adj[b].push_back(a);dg[b]++;}memset(p, -1, sizeof(p));memset(d, -1, sizeof(d));int root;for (i = 1; i <= n; i++) {if (dg[i] == 0) {root = i;break;}}d[root] = 0;dfs(root);for (j = 0; j < MAX - 1; j++)for (i = 1; i <= n; i++)if (p[i][j] != -1) p[i][j + 1] = p[p[i][j]][j];int a, b;cin >> a >> b;if (d[a] < d[b]) swap(a, b);int diff = d[a] - d[b];for (j = 0; diff; j++) {if (diff & 1) a = p[a][j];diff >>= 1;}if (a == b) {cout << a << '\n';continue;}for (j = MAX - 1; j >= 0; j--) {if (p[a][j] != -1 && p[a][j] != p[b][j]) {a = p[a][j];b = p[b][j];}}a = p[a][0];cout << a << '\n';}return 0;}
'BOJ' 카테고리의 다른 글
[1107] 리모컨 (0) 2022.04.25 [14500] 테트로미노 (0) 2022.04.22 [12789] 도키도키 간식드리미 (0) 2022.04.12 [3787] Count on Canton (0) 2022.04.09 [5525] IOIOI (0) 2022.04.07