๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 11437๋ฒˆ - LCA

by ์•ˆ์ฃผํ˜• 2022. 8. 17.

๋ฌธ์ œ

 

11437๋ฒˆ: LCA

์ฒซ์งธ ์ค„์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง€๊ณ , ๋‹ค์Œ N-1๊ฐœ ์ค„์—๋Š” ํŠธ๋ฆฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์„ ์•Œ๊ณ ์‹ถ์€ ์Œ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง€๊ณ , ๋‹ค์Œ M๊ฐœ ์ค„์—๋Š” ์ •

www.acmicpc.net

 

์ฝ”๋“œ

#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(์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ) ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

[๋ฐฑ์ค€,c++] 3584๋ฒˆ - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ

๋ฌธ์ œ 3584๋ฒˆ: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ ๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ(rooted tree)๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ทธ ํŠธ๋ฆฌ ์ƒ์˜ ๋‘ ์ •์ ์ด ์ฃผ์–ด์งˆ ๋•Œ ๊ทธ๋“ค์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ(Nearest Common Anscestor)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๋‘

dkswnkk.tistory.com

์ด ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์ ์€ ๊ณตํ†ต ์กฐ์ƒ์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋™๋นˆ ๋‹˜์˜ ์œ„ ์˜์ƒ์„ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • dfs๋ฅผ ๋Œ๋ ค ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ๊นŠ์ด๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณตํ†ต ๋ถ€๋ชจ๋ฅผ ์กฐ์‚ฌํ•  ๋‘ ๋…ธ๋“œ์˜ ๋†’์ด๋ฅผ ๋งž์ถฐ์ค๋‹ˆ๋‹ค.
  • ๋ถ€๋ชจ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€