반응형
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int>g[100001];
int depth[100001];
int dp[100001][30];
int visit[100001];
int n;
void dfs(int v,int d) //깊이 구하기
{
visit[v] = 1;
depth[v] = d;
for (int i = 0; i < g[v].size(); i++)
{
int data = g[v][i];
if (!visit[data])
{
dp[data][0] = v;
dfs(data, d + 1);
}
}
}
void MAKE() //각 노드의 조상 2k 구하기
{
for (int j = 1; j < 30; j++)
{
for (int i = 1; i <= n; i++)
{
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
}
}
int lca(int u, int v)
{
if (depth[u] < depth[v])swap(u, v);
int diff = depth[u] - depth[v];
for (int i = 0; diff; i++)
{
if (diff & 1) u = dp[u][i];
diff >>= 1;
}
if (u == v)return u;
//아니라면
for(int i=29;i>=0;i--)
{
if (dp[u][i] != dp[v][i])
{
u = dp[u][i];
v = dp[v][i];
}
}
return dp[u][0];
}
int main()
{
int a, b;
cin >> n;
for (int i = 0; i < n - 1; i++)
{
scanf("%d %d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1, 0);//깊이구하기
MAKE();
int m;
cin >> m;
while (m--)
{
scanf("%d %d", &a, &b);
printf("%d\n", lca(a, b));
}
}
반응형
'알고리즘문제풀이' 카테고리의 다른 글
[백준 10845]큐-연결리스트로 구현하기 (0) | 2021.02.09 |
---|---|
[백준 2042] 구간 합 구하기 (0) | 2019.10.14 |
[백준1158]조세퍼스문제 -연결리스트로 구현해보기 (0) | 2019.10.07 |
KMP알고리즘-문자열 찾기 (0) | 2019.10.01 |
next_permutation STL 구현 (1) | 2019.09.30 |