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

[๋ฐฑ์ค€,c++] 1761๋ฒˆ - ์ •์ ๋“ค์˜ ๊ฑฐ๋ฆฌ

by ์•ˆ์ฃผํ˜• 2022. 9. 1.

๋ฌธ์ œ

 

1761๋ฒˆ: ์ •์ ๋“ค์˜ ๊ฑฐ๋ฆฌ

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

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#define MAX 40001
using namespace std;

int N, M, max_height;
int depth[MAX];
vector<pair<int,int>>graph[MAX];
bool visited[MAX];
int parent[MAX][30];
int dist[MAX][30];

void dfs(int node, int _depth){
    visited[node] = 1;
    depth[node] = _depth;
    for(auto next: graph[node]){
        if(visited[next.first]) continue;
        parent[next.first][0] = node;
        dist[next.first][0] = next.second;
        dfs(next.first, _depth+1);
    }
}

void set_parent(){
    for(int i = 1; i<max_height; i++){
        for(int k=1; k<=N; k++){
            int prev_parent = parent[k][i-1];
            parent[k][i] = parent[prev_parent][i-1];
            if(parent[prev_parent][i-1] == 0) continue;
            dist[k][i] = dist[k][i-1] + dist[prev_parent][i-1];
        }
    }
}

int lca(int a, int b){
    int _dist = 0;
    if(depth[a] > depth[b]) swap(a, b);

    for(int i=max_height; i>=0; i--){   // ๊นŠ์ด ๋งž์ถ”๊ธฐ
        int diff = depth[b] - depth[a];
        int jump = 1 << i;
        if(jump <= diff){
            _dist += dist[b][i];
            b = parent[b][i];
        }
    }

    if(a == b) return _dist;

    for(int i=max_height; i>=0; i--){   // ์กฐ์ƒ์„ ํ–ฅํ•ด ์˜ฌ๋ผ๊ฐ€๊ธฐ
        if(parent[a][i] != parent[b][i]){
            _dist += dist[a][i];
            a = parent[a][i];
            _dist += dist[b][i];
            b = parent[b][i];
        }
    }

    _dist += dist[a][0] + dist[b][0];	//2์นธ์”ฉ ์˜ฌ๋ผ๊ฐ”์—ˆ์œผ๋‹ˆ, ๋ฐ”๋กœ ํ•œ์นธ ์œ„์— ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•ด์ค€๋‹ค.
    return _dist;
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N;
    int temp = N;
    
    while(temp>0){
        max_height++;
        temp = temp >> 1;
    }
    
    for(int i=0; i<N-1; i++){
        int a, b, c; cin>>a>>b>>c;
        graph[a].push_back({b,c});  // a ์—์„œ b๋กœ ๊ฐ€๋Š”๋ฐ c๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
        graph[b].push_back({a,c});  // ์–‘ ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ
    }
    
    dfs(1, 0);
    set_parent();
    cin>>M;
    for(int i=0; i<M; i++){
        int a, b; cin>>a>>b;
        cout<<lca(a, b)<<'\n';
    }
    
}

 

ํ’€์ด

 

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

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

dkswnkk.tistory.com

์œ„์˜ ๊ฐœ์„ ๋œ LCA๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  1. ๊ฐ ๋…ธ๋“œ์˜ ๋†’์ด๋ฅผ ๊ธฐ๋กํ•  ๋•Œ ๊ฐ ๋…ธ๋“œ์˜ ๋ฐ”๋กœ ์œ„ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ ๋…ธ๋“œ์˜ ๋†’์ด๋ฅผ ๋งž์ถฐ์ค„๋•Œ ๋†’์ด๋ฅผ ๋งž์ถ˜ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค.
  3. LCA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ์กฐ์ƒ์„ ์ฐพ์•„์„œ ์˜ฌ๋ผ๊ฐˆ ๋•Œ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค.
  4. LCA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ 2์˜ ์ œ๊ณฑํ˜•ํƒœ๋กœ ์˜ฌ๋ผ๊ฐ”์œผ๋‹ˆ ์ดˆ๊ธฐ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ํ•œ ์นธ ์œ„ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•ด์ค๋‹ˆ๋‹ค.

๋Œ“๊ธ€