알고리즘 문제 해결/BOJ

[LCA] BOJ 11437 LCA (C++)

jmkimmessi 2022. 9. 8. 00:00
반응형

https://www.acmicpc.net/problem/11437

 

11437번: LCA

첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정

www.acmicpc.net

 

문제 해결 알고리즘

 

LCA 기초 문제

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

const int MAX = 50000;

vector<int> tree[MAX+1];
int parent[MAX+1], depth[MAX+1];
bool visited[MAX+1];

void set_tree(int cur, int d){
    visited[cur] = true;
    depth[cur] = d;

    for (int i=0;i<tree[cur].size();i++){
        int next = tree[cur][i];

        if(!visited[next]){
            parent[next] = cur;
            set_tree(next, d+1);
        } 
    }
}


int LCA(int a, int b){

    if(depth[a] > depth[b]) swap(a, b);

    while(depth[a] != depth[b]) b = parent[b];

    while(a != b) {
        a = parent[a]; b = parent[b];
    }

    return a;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int N; cin >> N;

    int a, b;
    for(int i=0;i<N-1;i++){
        cin >> a >> b;

        tree[a].push_back(b);
        tree[b].push_back(a);
    }

    
    set_tree(1, 0);


    int M; cin >> M;

    for(int i=0;i<M;i++){
        cin >> a >> b;

        cout << LCA(a, b) << '\n';
    }

}
반응형