File tree Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Expand file tree Collapse file tree 1 file changed +57
-0
lines changed Original file line number Diff line number Diff line change 1+ #include < bits/stdc++.h>
2+ #define MAX 100001
3+
4+ using namespace std ;
5+
6+ int n, m;
7+ int parent[MAX]; // 부모에 대한 정보
8+ int d[MAX]; // 각 노드까지의 깊이(depth)
9+ int c[MAX]; // 각 노드의 깊이가 계산되었는지 여부
10+ vector<int > graph[MAX]; // 그래프(graph) 정보
11+
12+ // 루트 노드부터 시작하여 깊이(depth)를 구하는 함수
13+ void dfs (int x, int depth) {
14+ c[x] = true ;
15+ d[x] = depth;
16+ for (int i = 0 ; i < graph[x].size (); i++) {
17+ int y = graph[x][i];
18+ if (c[y]) continue ; // 이미 깊이를 구했다면 넘기기
19+ parent[y] = x;
20+ dfs (y, depth + 1 );
21+ }
22+ }
23+
24+ // A와 B의 최소 공통 조상을 찾는 함수
25+ int lca (int a, int b) {
26+ // 먼저 깊이(depth)가 동일하도록
27+ while (d[a] != d[b]) {
28+ if (d[a] > d[b]) {
29+ a = parent[a];
30+ }
31+ else b = parent[b];
32+ }
33+ // 노드가 같아지도록
34+ while (a != b) {
35+ a = parent[a];
36+ b = parent[b];
37+ }
38+ return a;
39+ }
40+
41+ int main () {
42+ cin >> n;
43+ for (int i = 0 ; i < n - 1 ; i++) {
44+ int a, b;
45+ cin >> a >> b;
46+ graph[a].push_back (b);
47+ graph[b].push_back (a);
48+ }
49+ dfs (1 , 0 ); // 루트 노드는 1번 노드
50+
51+ cin >> m;
52+ for (int i = 0 ; i < m; i++) {
53+ int a, b;
54+ cin >> a >> b;
55+ cout << lca (a, b) << ' \n ' ;
56+ }
57+ }
You can’t perform that action at this time.
0 commit comments