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

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

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

๋ฌธ์ œ

 

11438๋ฒˆ: LCA 2

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

www.acmicpc.net

 

์ฝ”๋“œ

#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';
    }
}

 

ํ’€์ด

 

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

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

dkswnkk.tistory.com

์ด์ „์— ํ’€์—ˆ๋˜ ์œ„ 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)์ด ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€