반응형

https://www.acmicpc.net/problem/3584

 

3584번: 가장 가까운 공통 조상

루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두

www.acmicpc.net

 

각 노드의 깊이를 구해둔 뒤, 입력 받은 두 노드 중 더 깊은 노드를 부모 노드로 올려서 같은 깊이로 맞춰줍니다.

같은 노드가 나올 때까지 부모 노드로 올려줍니다.

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int t, n, a, b;
int p[10001];
int d[10001];
vector<vector<int>> graph;

int getParent(int x) {
	if (p[x] == 0) return x;
	else return getParent(p[x]);
}

void dfs(int node, int depth) {
	d[node] = depth;
	for (int i = 0; i < graph[node].size(); i++) {
		dfs(graph[node][i], depth + 1);
	}
}

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);

		memset(p, 0, sizeof(p));
		graph.clear();
		graph.resize(n + 1);

		for (int i = 1; i < n; i++) {
			scanf("%d %d", &a, &b);
			p[b] = a;
			graph[a].push_back(b);
		}
		scanf("%d %d", &a, &b);

		int root = getParent(1);
		dfs(root, 0);
		while (d[a] != d[b]) {
			if (d[a] > d[b]) a = p[a];
			else b = p[b];
		}
		while (a != b) {
			a = p[a];
			b = p[b];
		}
		printf("%d\n", a);
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 11438 : LCA 2  (0) 2021.11.18
백준 17435 : 합성함수와 쿼리  (0) 2021.11.18
백준 21922 : 학부 연구생 민상  (0) 2021.11.18
백준 21939 : 문제 추천 시스템 Version 1  (0) 2021.11.18
백준 21924 : 도시 건설  (0) 2021.11.17

+ Recent posts