- C++
- ํธ๋ฆฌ
- js
- ์นด์นด์ค ์ฝํ
- ์๊ณ ๋ฆฌ์ฆ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์์ฝ๋
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- LCs
- DFS
- ์ด๋ถํ์
- ์ฌ๊ท
- Python
- ์น๋ฆฐ์ด
- ํ๋ฆฌ์จ๋ณด๋ฉ
- golang
- ์ํฐ๋
- ์นด์นด์ค2021
- ๋นํธ๋ง์คํน
- nestjs
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค
- BFS
- ๋นํธ๋งต
- go
- ๋ค์ต์คํธ๋ผ
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- DP
- Union-Find
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 11437, 11438. LCA 1,2 ๋ณธ๋ฌธ
๋ฌธ์
https://www.acmicpc.net/problem/11437 -> LCA 1
https://www.acmicpc.net/problem/11438 -> LCA 2
์ฃผ์ด์ง ๋ ๋ ธ๋์ ๋ํด LCA(๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์)์ ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
1๋ฒ๊ณผ 2๋ฒ์ ์ฐจ์ด๋ ๋ ธ๋์ ์ต๋ ๊ฐฏ์ ๋ฐ ์๊ฐ ์ ํ์ ์ฐจ์ด์ด๋ค.
LCA2๊ฐ ํจ์ฌ ๋นก๋นกํ๋ค.
ํ์ด
1. 11437 LCA1๋ฒ ํ์ด
์ฐ๊ฒฐ๋ ๋ ๋ ธ๋ a,b๊ฐ N-1๊ฐ์ ์ค์ ๊ฑธ์ณ์ ์ ๋ ฅ๋๋๋ฐ, a,b์ค์ ์ด๋ค ๋ ธ๋๊ฐ ๋ถ๋ชจ๋ ธ๋์ธ์ง๋ ์ ๋ ฅ ๋ฐ์ ๋์๋ ์ ์๊ฐ ์๋ค.
๊ทธ๋์ ์ฒ์์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ ํํ๋ก ์ ์ฅํ๋ค๊ฐ, ์ ๋ ฅ์ ๋ค ๋ฐ์ ํ์ BFS๋ฅผ ํตํด ๋ฃจํธ์ธ 1๋ถํฐ ํ๊ณ ๋ค์ด๊ฐ์ ํธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ํ์ ํ ์ ์๋๋ก ํ๋ค. (๊ฐ ๋ ธ๋์ ๋ถ๋ชจ์, ๊น์ด ์ ์ฅ)
๊ทธ๋ฆฌ๊ณ LCA๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์, a,b์ ๊น์ด๊ฐ ๋ค๋ฅด๋ฉด, ๊ฐ์์ง ๋ ๊น์ง a,b์ค์ ๊น์ด๊ฐ ๊น์ ๋ ธ๋๋ฅผ ๋ถ๋ชจ๋ก ๊ฐฑ์ ์ํค๋ฉด์ ๊น์ด๊ฐ ๊ฐ์์ง๋๋ก ํ๋ค.
๊ทธ ํ์๋ ๋ ๋ ธ๋ a,b๊ฐ ๊ฐ์ ๊ฐ์ด ๋ ๋ ๊น์ง, ํ ๋จ๊ณ์ฉ ์๋ก ์ฌ๋ผ์ค๋ฉด์ ๊ฐฑ์ ์ํค๋ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค.
2. 11438 LCA2๋ฒ ํ์ด
1๋ฒ ํ์ด๋ฅผ ๊ทธ๋๋ก ์ ์ถํ๋๋ ์ญ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค!
ํ ๊ฐ์ง ๋คํ์ธ๊ฑด, ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ง ์๊ณ DP๋ง์ผ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด์๋ค.
ํธ๋ฆฌ์ ๊ตฌ์กฐ๊ฐ ๊ณ์ ๋ณํ๋ ๋ฌธ์ ๊ฐ ์๋๋ผ์ DP๋ฐฉ์์ ์ด์ฉํ ์ ์๋ ๊ฒ ๊ฐ๋ค.
parent๋ฐฐ์ด์ 2์ฐจ์์ผ๋ก ๋ง๋ค์ด์, ๊ฐ ๋ ธ๋๋ณ๋ก 2^i๋ฒ์งธ์ ๋ถ๋ชจ๋ฅผ parent[n][i]์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ LCA๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์, 1๋ฒ๊ณผ ๋น์ทํ์ง๋ง 2์ฐจ์์ผ๋ก ๋ง๋ parent๋ฅผ ์ด์ฉํด์ ๋ ์ ์ ์๊ฐ๋ณต์ก๋๋ก ๊ตฌํ ์ ์๋ค.
a์ b์ ๋์ด๋ฅผ ๊ฐ๊ฒ ๋ง๋ ๋ค์์ ํ ๋จ๊ณ์ฉ ์๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ๊ณ์ฐํ๋ ๊ณผ์ ์ 1๋ฒ๊ณผ ๋๊ฐ์ง๋ง, a์ b์ ๋์ด๋ฅผ ๊ฐ๊ฒ ๋ง๋ค ๋, 1๋ฒ์ ํ ๋จ๊ณ์ฉ ์์ง์ด๋ ๋ฐ๋ฉด์, 2๋ฒ์ 2๋ก ๋๋ ์ ๋ฐ์ฉ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ตฌํ๊ธฐ ๋๋ฌธ์ 2๋ฒ์์ ๊ณ์ฐ ํ์๊ฐ ์ค์ด๋ค๊ฒ๋๋ค.
์ฝ๋
1๋ฒ ์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
#define sc scanf_s
#define maxN 50001
using namespace std;
int N, M;
vector<int> graph[maxN];
int parent[maxN];
int depth[maxN];
bool visited[maxN];
int max_depth = 0;
void BFS(int start) { //๋ถ๋ชจ-์์ ๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ธฐ ์ํจ
queue<int> q;
q.push(start);
depth[start] = 0;
visited[start] = 1;
while (!q.empty()) {
int temp = q.front();
q.pop();
for (int i = 0;i < graph[temp].size();i++) {
int next = graph[temp][i];
if (!visited[next]) {
visited[next] = 1;
parent[next] = temp;
depth[next] = depth[temp] + 1;
if (depth[next] > max_depth) max_depth = depth[next];
q.push(next);
}
}
}
}
int findCommonParent(int a, int b) {
int a_d = depth[a];
int b_d = depth[b];
while (true) {
// depth๊ฐ ๋ค๋ฅธ๋ฐ ๋ถ๋ชจ๊ฐ ๊ฐ์ ์๋ ์์
if (a_d > b_d) {
a_d--;
a = parent[a];
}
else if (a_d < b_d) {
b_d--;
b = parent[b];
}
else {
if (a == b) {
return a;
}
a_d--;
a = parent[a];
b_d--;
b = parent[b];
}
}
}
int main() {
sc("%d", &N);
for (int i = 1;i < N;i++) {
int a, b;
sc("%d %d", &a, &b);
graph[a].push_back(b);
graph[b].push_back(a);
}
// ๋ถ๋ชจ ์์ ์ฐพ๊ธฐ
BFS(1);
sc("%d", &M);
for (int i = 0;i < M;i++) {
int a, b;
sc("%d %d", &a, &b);
// ๊ณตํต์กฐ์ ์ฐพ์ ์ถ๋ ฅ
printf("%d\n", findCommonParent(a, b));
}
return 0;
}
2๋ฒ ์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
#define sc scanf_s
#define maxN 100001
#define maxD 18 // 10^5 < 2^17
using namespace std;
int N, M;
vector<int> graph[maxN];
int parent[maxN][maxD]; // n์ 2^d๋ฒ ์งธ ๋ถ๋ชจ
int depth[maxN];
bool visited[maxN];
int max_depth = 0;
void BFS(int start) { //๋ถ๋ชจ-์์ ๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ธฐ ์ํจ
queue<int> q;
q.push(start);
depth[start] = 0;
visited[start] = 1;
while (!q.empty()) {
int temp = q.front();
q.pop();
for (int i = 0;i < graph[temp].size();i++) {
int next = graph[temp][i];
if (!visited[next]) {
visited[next] = 1;
parent[next][0] = temp;
depth[next] = depth[temp] + 1;
if (depth[next] > max_depth) max_depth = depth[next];
q.push(next);
}
}
}
}
int findCommonParent(int a, int b) {
int a_d = depth[a];
int b_d = depth[b];
if (b_d > a_d) { // ํญ์ a_d >= b_d ์ด๋๋ก
int temp;
temp = a; a = b; b = temp;
a_d = depth[a]; b_d = depth[b];
}
// a, b ๋์ด ๋ง์ถ๊ธฐ
int gap = a_d - b_d; int d = 0;
while (gap) {
if (gap % 2 == 1) {
a = parent[a][d];
}
d++;
gap /= 2;
}
if (a == b) return a;
//a์ b์ ๋ถ๋ชจ๊ฐ ๊ฐ๋๋ก ๋ง์ถฐ์ค
// maxD๋ถํฐ ์์ํ๋ ์ด์ : ๊ฐ์ฅ "๊ฐ๊น์ด" ๊ณตํต ์กฐ์์ ๊ตฌํด์ผ ํ๋ฏ๋ก,
// j๊ฐ 0์ด๋ ์ต๋ํ ๊ฐ๊น์ธ ๋๊ฐ ๋ต์ด ๋์ด์ผํจ
for (int j = maxD - 1;j >= 0;j--) {
if (parent[a][j] != parent[b][j]) {
a = parent[a][j]; b = parent[b][j];
}
}
a = parent[a][0];
return a;
}
int main() {
sc("%d", &N);
for (int i = 1;i < N;i++) {
int a, b;
sc("%d %d", &a, &b);
graph[a].push_back(b);
graph[b].push_back(a);
}
// ํธ๋ฆฌ ๋ง๋ค๊ธฐ
BFS(1);
// DP ๊ฐ ์ฑ์ฐ๊ธฐ
for (int i = 0;i < maxD;i++) {
for (int j = 1;j <= N;j++) {
int k = parent[j][i];
if (k != 0) parent[j][i + 1] = parent[k][i];
}
}
sc("%d", &M);
for (int i = 0;i < M;i++) {
int a, b;
sc("%d %d", &a, &b);
// ๊ณตํต์กฐ์ ์ฐพ์ ์ถ๋ ฅ
printf("%d\n", findCommonParent(a, b));
}
return 0;
}
๊ฒฐ๊ณผ
11437 LCA 1
11438 LCA 2
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 13701. ์ค๋ณต ์ ๊ฑฐ (0) | 2021.08.03 |
---|---|
[C/C++] scanf, scanf_s๋ก ์ ๋ ฅ๋ฐ์ ๋ "\n" ์ด ์์ฌ ๋ค์ด๊ฐ๋ ๋ฌธ์ (0) | 2021.07.30 |
[๋ฐฑ์ค/C++] 12888. ์์ ์ด์ง ํธ๋ฆฌ ๋๋ก ๋คํธ์ํฌ (0) | 2021.07.20 |
[๋ฐฑ์ค/C++] 10838. ํธ๋ฆฌ (0) | 2021.07.20 |
[๋ฐฑ์ค/C++] 19535. ใทใทใทใ (0) | 2021.07.13 |