[c++] BOJ 3584 :: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ

๋‚œ์ด๋„ : ๊ณจ๋“œ 4

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 40๋ถ„

 

๋ฌธ์ œ

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

  • ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์€, ๋‘ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ž์†์œผ๋กœ ๊ฐ€์ง€๋ฉด์„œ ๊นŠ์ด๊ฐ€ ๊ฐ€์žฅ ๊นŠ์€(์ฆ‰ ๋‘ ๋…ธ๋“œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด) ๋…ธ๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

nca.png

์˜ˆ๋ฅผ ๋“ค์–ด 15์™€ 11๋ฅผ ๋ชจ๋‘ ์ž์†์œผ๋กœ ๊ฐ–๋Š” ๋…ธ๋“œ๋Š” 4์™€ 8์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ๊นŠ์ด๊ฐ€ ๊ฐ€์žฅ ๊นŠ์€(15์™€ 11์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด) ๋…ธ๋“œ๋Š” 4 ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์€ 4๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๋‘ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๊ทธ ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”

 

ํ’€์ด

  • b+tree๋ฅผ vector<int> ์ถœ๋ ฅํ•ด์„œ ํ•ด๊ฒฐ

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int n;
int head;
vector<vector<int>> childrenList;
vector<int> parentList;

vector<int> findVector(int n) {
    int start = n;
    vector<int> str;
    str.push_back(start);
    while (parentList[start] != 0) {
        start = parentList[start];
        str.push_back(start);
    }

    // ๋’ค์ง‘๊ธฐ => ์ œ๊ฑฐํ•ด๋„ ๋˜‘๊ฐ™์Œ
    /*vector<int> res(str.size());
    for (int i = 0; i < str.size(); i++) {
        res[i] = str[str.size() - i-1];
    }*/
    return str;
}

int findCommonParent(int n1, int n2) {
    vector<int> str1 = findVector(n1);
    vector<int> str2 = findVector(n2);
    int minLength = str1.size() < str2.size() ? str1.size() : str2.size();

    int result = head;
    for (int i = 1; i <= minLength; i++) {
        if (str1[str1.size()-i] != str2[str2.size()-i])
            break;
        result = str1[str1.size() - i];
    }
    return result;
}

int main() {
    // ๋ฃจํŠธ๋ถ€ํ„ฐ ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€์˜ path๋ฅผ string์œผ๋กœ ์ถœ๋ ฅ
    // ๋†’์ด(string์˜ ๊ธธ์ด)๋Š” ๊นŠ์–ด๋ดค์ž 10^4

    int t; cin >> t;
    while (t--) {
        cin >> n;

        // ์ดˆ๊ธฐํ™”
        childrenList = vector<vector<int>>(n + 1, vector<int>());
        parentList = vector<int>(n+1);

        for (int i = 0; i < n-1; i++) {
            int s; int e; cin >> s >> e;
            childrenList[s].push_back(e);
            parentList[e] = s; // ๋ถ€๋ชจ ๋…ธ๋“œ ์ €์žฅ
        }

        // ๋ฃจํŠธ๋…ธ๋“œ ์ฐพ๊ธฐ
        head = 1;
        while (parentList[head] != 0) {
            head = parentList[head];
        }

        int n1, n2; cin >> n1 >> n2; // ์ฐพ์„ ๋‘ ๋…ธ๋“œ

        cout << findCommonParent(n1, n2) << '\n';

    }

}

 

๊ฐœ์„ 

  • ๋’ค์ง‘๊ธฐ ์ œ๊ฑฐํ•ด๋„ ์‹œ๊ฐ„ ๋˜‘๊ฐ™์Œ

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2684 28 C++17 / ์ˆ˜์ • 1482
๋ฐ˜์‘ํ˜•