반응형
https://www.acmicpc.net/problem/11438
11438번: LCA 2
첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정
www.acmicpc.net
[ 문제풀이 ]
다음 글의 두 번째 풀이 방식과 동일합니다!
https://rudalsd.tistory.com/68?category=1064612
[ 백준 ] 1761번 - 정점들의 거리 (C++)
https://www.acmicpc.net/problem/1761 1761번: 정점들의 거리 첫째 줄에 노드의 개수 N이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리를 입력받는다. 그 다음 줄에 M이 주어지고, 다음 M개의 줄
rudalsd.tistory.com
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include<iostream> #include<vector> #include<cmath> using namespace std; int N, M; vector<int> list[100001]; //간선 정보 int parent[100001][18]; //2^i번째 부모 int height[100001]; //각 노드의 높이 int visited[100001]; //방문 여부 int limit; void dfs(int cur) //그래프 { if (visited[cur] == 1) return; visited[cur] = 1; for (auto next : list[cur]) { if (visited[next] == 0) { height[next] = height[cur] + 1; parent[next][0] = cur; dfs(next); } } } int find(int a, int b) //LCA 찾기 { if (height[a] > height[b]) { //a가 루트에 더 가깝게 int temp = a; a = b; b = temp; } for (int i = limit; i >= 0; i--) { //높이 맞추기 int mask = 1 << i; if (height[b] - height[a] >= mask) { b = parent[b][i]; } } if (a == b) return a; //같은 노드라면 a return for (int i = limit; i >= 0; i--) { //같인 부모 찾기 if (parent[a][i] == parent[b][i]) continue; a = parent[a][i]; b = parent[b][i]; } return parent[a][0]; } int main() { scanf("%d", &N); limit = ceil(log2(N)); for (int i = 0; i < N - 1; i++) { //간선 정보 얻기 int a, b; scanf("%d %d", &a, &b); list[a].push_back(b); list[b].push_back(a); } dfs(1); for (int i = 1; i < limit; i++) { //parent배열 채우기 for (int j = 1; j <= N; j++) { int next = parent[j][i - 1]; if (next != 0) { parent[j][i] = parent[next][i - 1]; } } } scanf("%d", &M); for (int i = 0; i < M; i++) { int a, b; scanf("%d %d", &a, &b); printf("%d\n", find(a, b)); } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 16287번 - Parcel (C++) (0) | 2022.08.06 |
---|---|
[ 백준 ] 10026번 - 적록색약 (C++) (0) | 2022.08.05 |
[ 백준 ] 1725번 - 히스토그램 (C++) (0) | 2022.08.03 |
[ 백준 ] 6549번 - 히스토그램에서 가장 큰 직사각형 (C++) (0) | 2022.08.02 |
[ 백준 ] 1629번 - 곱셈 (C++) (0) | 2022.08.01 |