๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int>graph[50001];
int depth[50001];
int parent[50001];
bool visited[50001];
void dfs(int node, int _depth){
visited[node] = 1;
depth[node] = _depth;
for(auto next: graph[node]){
if(!visited[next]){
parent[next] = node; // ๋ถ๋ชจ ์ธํ
dfs(next, _depth + 1);
}
}
}
int lca(int a, int b){
while(parent[a]!=parent[b]){ // ๋ถ๋ชจ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ
if(depth[a] < depth[b]){ // ๋์ด๋ฅผ ๋ง์ถฐ์ค๋ค(๋์ด๊ฐ ๊ธด ์ชฝ์ ์ ๊ฒํ๋ค.)
b = parent[b];
}
else a = parent[a];
}
while(a!=b){
a = parent[a];
b = parent[b];
}
return a;
}
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);
}
dfs(1, 0); // depth ์ ์ฅํ๊ธฐ
cin>>M;
for(int i=0; i<M; i++){
int a, b; cin>>a>>b;
cout<< lca(a,b)<<'\n';
}
}
ํ์ด
LCA(์ต์ ๊ณตํต ์กฐ์) ๋ฌธ์ ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๋ค๋ฅธ ์ ์ ๊ณตํต ์กฐ์์ ์ฐพ๋ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ์ฃผ์ด์ง๋ค๋ ์ ์ ๋๋ค.
๋๋๋น ๋์ ์ ์์์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- dfs๋ฅผ ๋๋ ค ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ์ ๊น์ด๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
- ๊ณตํต ๋ถ๋ชจ๋ฅผ ์กฐ์ฌํ ๋ ๋ ธ๋์ ๋์ด๋ฅผ ๋ง์ถฐ์ค๋๋ค.
- ๋ถ๋ชจ๋ฅผ ์ฐพ์ต๋๋ค.
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 10971๋ฒ - ์ธํ์ ์ํ2 (0) | 2022.08.20 |
---|---|
[๋ฐฑ์ค,c++] 17266๋ฒ - ์ด๋์ด ๊ตด๋ค๋ฆฌ (0) | 2022.08.18 |
[๋ฐฑ์ค,c++] 17521๋ฒ - Byte Coin (0) | 2022.08.18 |
[๋ฐฑ์ค,c++] 15900๋ฒ - ๋๋ฌด ํ์ถ (0) | 2022.08.15 |
[๋ฐฑ์ค,c++] 1595๋ฒ - ๋ถ์ชฝ๋๋ผ์ ๋๋ก (0) | 2022.08.15 |
[๋ฐฑ์ค,c++] 14267๋ฒ - ํ์ฌ ๋ฌธํ1 (0) | 2022.08.15 |
๋๊ธ