๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
vector<int> graph[100001];
bool visited[100001];
int parent[100001][21];
int depth[100001];
int N, M, max_height;
void dfs(int node, int _depth){ // ๋
ธ๋ ๊น์ด ์ธํ
visited[node] = 1;
depth[node] = _depth;
for(auto next: graph[node]){
if(visited[next]) continue;
parent[next][0] = node; // ํ ์นธ ์์ ์กฐ์ ์ ์ฅ
dfs(next, _depth+1);
}
}
void parent_set(){ // ์ ์ฒด ๋ถ๋ชจ ์ธํ
for(int i=1; i<max_height; i++){ // max height
for(int k=1; k<=N; k++){
if(parent[k][i-1] != 0){
parent[k][i] = parent[parent[k][i-1]][i-1];
}
}
}
}
int lca(int a, int b){
if(depth[a] > depth[b]) swap(a,b); // b์ ๋
ธ๋์ ๊น์ด๊ฐ ๋ ๊น๊ฒ ๋ง๋ค์ด์ค๋ค.
for(int i=max_height; i>=0; i--){ // depth๊ฐ ๊ฐ๋๋ก ์ธํ
int diff = depth[b] - depth[a]; // ๋ ๋
ธ๋์ ๊น์ด ์ฐจ
if(diff >= (1<<i)) b = parent[b][i];
}
if(a == b) return a;
for(int i=max_height; i>=0; i--){ // ์กฐ์์ ํฅํด ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ
if(parent[a][i] != parent[b][i]){
a = parent[a][i];
b = parent[b][i];
}
}
return parent[a][0];
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N;
for(int i=0; i<N-1; i++){
int a, b; cin>>a>>b;
graph[a].push_back(b);
graph[b].push_back(a);
}
int temp = N;
while(temp>0){
max_height++;
temp = temp>>1;
}
dfs(1,0);
parent_set();
cin>>M;
for(int i=0; i<M; i++){
int a, b; cin>>a>>b;
cout<<lca(a,b)<<'\n';
}
}
ํ์ด
์ด์ ์ ํ์๋ ์ LCA 1๋ฌธ์ ์์ ์ ์ ์ ๊ฐ์๊ฐ 50,000์์ 100,000์ผ๋ก ๋์ด๋ฌ๊ณ , ๋ ๋ ธ๋์ ์ ์ญ์ 10,000์์ 100,000์ผ๋ก ๋์ด๋ฌ์ต๋๋ค.
๋ฐ๋ผ์ ํธ๋ฆฌ์ ๋์ด๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ํ ๋จ๊ณ์ฉ ์ฌ๋ผ๊ฐ๋ฉด์ ๋ง์ถ๋ ๊ฒฝ์ฐ๋ ํธ๋ฆฌ๊ฐ ๊น์ด์ง์๋ก ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด์ ํ์ด ๋ฐฉ์์์ ์กฐ๊ธ ๋ ๊ฐ์ ์ ์ ์ฐพ์์ผ ํ๋๋ฐ ๊ฐ ๋ ธ๋๊ฐ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
- ๋ง์ฝ ์ด 15์นธ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผ ํ๋ค๋ฉด?
- 8์นธ -> 4์นธ -> 2์นธ -> 1์นธ
- 2์ ์ ๊ณฑ ํํ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋๋ก ํ๋ฉด O(logN)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธ ๋ ์ฌ์ฉํ์ฌ ๊ฐ ๋ ธ๋์ ๋ํ์ฌ 2^i๋ฒ์งธ ๋ถ๋ชจ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ฆ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํด ๊ฐ ๋ถ๋ชจ์ 2^i๋ฒ์งธ ๋ถ๋ชจ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ์ฌ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋งค ์ฟผ๋ฆฌ๋ง๋ค ๋ถ๋ชจ๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ ์ํด (logN)์ ๋ณต์ก๋๊ฐ ํ์ํ๋ฉฐ, ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋์ ์๊ฐ ๋ณต์ก๋๋ O(MlogN)์ด ๋ฉ๋๋ค.
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 18116๋ฒ - ๋ก๋ด ์กฐ๋ฆฝ (0) | 2022.09.02 |
---|---|
[๋ฐฑ์ค,c++] 17144๋ฒ - ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2022.09.02 |
[๋ฐฑ์ค,c++] 1761๋ฒ - ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ (0) | 2022.09.01 |
[๋ฐฑ์ค,c++] 16236๋ฒ - ์๊ธฐ ์์ด (0) | 2022.08.28 |
[๋ฐฑ์ค,c++] 15686๋ฒ - ์นํจ ๋ฐฐ๋ฌ (0) | 2022.08.26 |
[๋ฐฑ์ค,c++] 16234๋ฒ - ์ธ๊ตฌ ์ด๋ (0) | 2022.08.25 |
๋๊ธ