- ํ๋ก๊ทธ๋๋จธ์ค
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- go
- Python
- js
- DP
- ๋นํธ๋ง์คํน
- ์ฌ๊ท
- ์ด๋ถํ์
- ์น๋ฆฐ์ด
- ์๊ณ ๋ฆฌ์ฆ
- golang
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- C++
- ๋ค์ต์คํธ๋ผ
- DFS
- ์ํฐ๋
- LCs
- nestjs
- ๋ฐฑ์ค
- ํธ๋ฆฌ
- ๋นํธ๋งต
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- Union-Find
- ์นด์นด์ค ์ฝํ
- ์นด์นด์ค2021
- BFS
- ์์ฝ๋
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 3584. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต์กฐ์ ๋ณธ๋ฌธ
๋ฌธ์
https://www.acmicpc.net/problem/3584
๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ(rooted tree)๊ฐ ์ฃผ์ด์ง๊ณ , ๊ทธ ํธ๋ฆฌ ์์ ๋ ์ ์ ์ด ์ฃผ์ด์ง ๋ ๊ทธ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์(Nearest Common Anscestor)์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
- ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์, ๋ ๋ ธ๋๋ฅผ ๋ชจ๋ ์์์ผ๋ก ๊ฐ์ง๋ฉด์ ๊น์ด๊ฐ ๊ฐ์ฅ ๊น์(์ฆ ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด) ๋ ธ๋๋ฅผ ๋งํฉ๋๋ค.
์๋ฅผ ๋ค์ด 15์ 11๋ฅผ ๋ชจ๋ ์์์ผ๋ก ๊ฐ๋ ๋ ธ๋๋ 4์ 8์ด ์์ง๋ง, ๊ทธ ์ค ๊น์ด๊ฐ ๊ฐ์ฅ ๊น์(15์ 11์ ๊ฐ์ฅ ๊ฐ๊น์ด) ๋ ธ๋๋ 4 ์ด๋ฏ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ 4๊ฐ ๋ฉ๋๋ค.
๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ , ๋ ๋ ธ๋๊ฐ ์ฃผ์ด์ง ๋ ๊ทธ ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์
ํ์ด
์ ๋ ฅ๋ ํธ๋ฆฌ์ ๊ด๊ณ?๋ฅผ
parent[idx]์ ์ ์ฅํ๋ค.
-> parent[idx] = idx์ ๋ถ๋ชจ ๋ฒํธ
๋ ธ๋๋ฒํธ๊ฐ 1๋ถํฐ ์์ํจ์ผ๋ก, parent[idx] == 0์ธ ๋ ธ๋๊ฐ ๋ฃจํธ ๋ ธ๋์์ ์ ์ ์๋ค.
์ด๋ ๊ฒ ์ ์ฅํ ํ์, ์ ๋ ฅ๋ ๋ ๋ ธ๋ A, B์ ๋ํด
์์ ๋ถํฐ ~ ๋ฃจํธ๊น์ง ๋ถ๋ชจ๋ฅผ ๊ณ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ฒกํฐ์ ์ ์ฅํ๋ค.
(parent[idx] == 0์ผ ๋ ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ)
๊ทธ ๋ค์์, A๋ก ๋ง๋ ๋ฒกํฐ์ B๋ก ๋ง๋ ๋ฒกํฐ์ ๊ฐ์ ๋น๊ตํ๋ฉฐ, ๊ฐ์ฅ ๋จผ์ ๊ฐ์ ๋ ธ๋?๋ฒํธ?๊ฐ ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต์กฐ์์ด๋ค.
* ๋ฒกํฐ์ ๋ถ๋ชจ๋ฅผ ์ ์ฅํ ๋, ์๊ธฐ ๋ถ๋ชจ๋ถํฐ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ ์๊ธฐ ์์ ๋ถํฐ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
int main() {
int T,N;
cin >> T;
for (int t = 0;t < T;t++) {
cin >> N;
vector<int> my_parent(10001, 0);
for (int n = 0;n < N-1;n++) {
int A, B;
cin >> A >> B;
my_parent[B] = A;
}
int a, b;
cin >> a >> b;
// ๋ฃจํธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ
vector<int> _a; //A ~ ๋ฃจํธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ๊ฒฝ๋ก ์ ์ฅ
vector<int> _b; //B ~ ๋ฃจํธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ๊ฒฝ๋ก ์ ์ฅ
int now = a;
while (now != 0) {
_a.push_back(now);
now = my_parent[now];
}
now = b;
while (now != 0) {
_b.push_back(now);
now = my_parent[now];
}
// ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์ ์ฐพ๊ธฐ
bool isFind = false;
for (int i = 0;i < _a.size();i++) {
if (isFind) break;
for (int j = 0;j < _b.size();j++) {
if (_a[i] == _b[j]) {
cout << _a[i] << endl;
isFind = true;
break;
}
}
}
}
}
๊ฒฐ๊ณผ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 10838. ํธ๋ฆฌ (0) | 2021.07.20 |
---|---|
[๋ฐฑ์ค/C++] 19535. ใทใทใทใ (0) | 2021.07.13 |
[๋ฐฑ์ค/C++] 5052. ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2021.07.06 |
[๋ฐฑ์ค/C++] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.06.29 |
[๋ฐฑ์ค/C++] 1600. ๋ง์ด ๋๊ณ ํ ์์ญ์ด (0) | 2021.06.29 |