- ์์ฝ๋
- go
- ๋ค์ต์คํธ๋ผ
- ์น๋ฆฐ์ด
- ๋ฐฑ์ค
- golang
- C++
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- js
- ๋นํธ๋ง์คํน
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์ด๋ถํ์
- DP
- ๋นํธ๋งต
- BFS
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฌ๊ท
- nestjs
- DFS
- ์ํฐ๋
- ์นด์นด์ค2021
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- LCs
- ์๊ณ ๋ฆฌ์ฆ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- Python
- ์นด์นด์ค ์ฝํ
- ํธ๋ฆฌ
- ํ๋ฆฌ์จ๋ณด๋ฉ
- Union-Find
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 10838. ํธ๋ฆฌ ๋ณธ๋ฌธ
๋ฌธ์
https://www.acmicpc.net/problem/10838
N๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ๋ ธ๋๋ 0๋ถํฐ N-1๊น์ง์ ๋ฒํธ๋ก ๊ตฌ๋ณ๋๊ณ , 0๋ฒ ๋ ธ๋๋ ๋ฃจํธ ๋ ธ๋์ด๊ณ , ๋๋จธ์ง ๋ ธ๋ ๊ฐ๊ฐ์ 0๋ฒ ๋ ธ๋์ ์์ ๋ ธ๋์ด๋ค.
ํธ๋ฆฌ์ ์ ์ฉํ ์ ์๋ ์ฐ์ฐ์ ์ธ ์ข ๋ฅ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ํธ๋ฆฌ์ ๋ชจ์์ ๋ฐ๊พธ๊ฑฐ๋ ํธ๋ฆฌ ์์ง์ ์์น ์ ํ ์ ์๋ค. ๊ฐ ์ฐ์ฐ๊ณผ ๊ทธ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- paint(a, b, c): a๋ฒ ๋ ธ๋์ b๋ฒ ๋ ธ๋๋ฅผ ์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ํ, ๊ฒฝ๋ก ์์ ์๋ ๋ชจ๋ ์์ง๋ฅผ ์๊น c๋ก ์น ํ๋ค.
- move(a, b): a๋ฒ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ b๋ฒ ๋ ธ๋๋ก ๋ฐ๊พผ๋ค. ๋จ, b๋ฒ ๋ ธ๋๋ a๋ฒ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ํ๋ ๋ถํธ๋ฆฌ(subtree)์ ์ํ์ง ์๋๋ค. ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๋ฐ๊พธ๊ธฐ ์ a๋ฒ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ p๋ผ ํ ๋, ์๋ก์ด ์์ง (a,b)๋ ์๋์ ์์ง (a,p)์ ์๊น์ ๊ฐ๋๋ค.
- count(a, b): a๋ฒ ๋ ธ๋์ b๋ฒ ๋ ธ๋๋ฅผ ์๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ํ, ๊ทธ ๊ฒฝ๋ก ์ฌ์ด์ ์๋ ์์ง์ ์น ํด์ง ์๋ก ๋ค๋ฅธ ์๊น์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ง์ ์น ํ๋ ์๊น c๋ฅผ ์ ์๋ก ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ์์๋ ๋ชจ๋ ์์ง์ ์๊น์ด 0์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
ํ์ด
paint๋ช ๋ น๊ณผ count๋ช ๋ น์์ ๋ ธ๋๊ฐ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํ๋ค.
ํธ๋ฆฌ์์๋ ๋ ๋ ธ๋๊ฐ ์ต๋จ๊ฒฝ๋ก๋ ๋ฌด์กฐ๊ฑด ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ๊ฑฐ์ณ๊ฐ๋ค!
๋ฐ๋ผ์ ์ง๋๋ฒ์ ํ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์ ํ์ด๋ฅผ ํ์ฉํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค.
parent๋ฐฐ์ด์ pair<int,int>(๋ถ๋ชจ ๋ ธ๋ ๋ฒํธ, ์๊น) ์ ์ ์ฅํด์ ์ด์ฉํ์๋ค.
๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์, ์ง๋๋ฒ์ ํ์๋ ๋ฐฉ์์ผ๋ก ํ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค!
๊ฒ์ํด๋ณด๋ LCS(Least Common Ancestor) ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฝค๋ ์ ํํ๋? ์ ๋ช ํ? ์๊ณ ๋ฆฌ์ฆ์ด์๋ค.
์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก๋ ํ ์ ์๋ค๊ณ ํ๋๋ฐ, ์ง๊ธ์ ์ดํด๊ฐ ์๋์ด์ DP ๋น์ทํ ๋ฐฉ์์ ์ด์ฉํ๋ค.
check๋ฐฐ์ด์ ์ด์ฉํด์, a์ b์ฌ์ด์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ์ ๋, ํ ๋จ๊ณ์ฉ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ ๋ฐ๊ฒฌํ ๋ ธ๋๋ฅผ ์ฒดํฌ๋ฐฐ์ด์ ํ์ํ๋ค. ํ์ํ๊ธฐ์ ์, ์ด๋ฏธ ํ์๋ ๋ ธ๋์ด๋ฉด ๊ทธ ๋ ธ๋๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ด ๋๋ค!
check๋ฐฐ์ด์ bool๋ก ํ๊ณ , ๋งค๋ฒ ๊ณตํต์กฐ์์ ์ฐพ์ ๋ ์ด๊ธฐํํ๊ฒ ํ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ๊ฒ ๊ฐ์์,
int๋ก ํ๊ณ ๋งค๋ฒ ๊ณตํต์กฐ์์ ์ฐพ์ ๋ ๋ง๋ค ํ์ํ๋ ๊ฐ์ ํ๋์ฉ ์ฆ๊ฐ์์ผ์ ์ฌ์ฉํ๋ค.
์ฝ๋
#include <iostream>
#include <vector>
#include <unordered_set>
#define sc scanf_s
using namespace std;
int N, K;
pair<int, int> parent[100001]; // <๋ถ๋ชจ ๋
ธ๋ ๋ฒํธ, ์๊น>
int check[100001];
int temp = 0;
int findCommonParent(int a, int b) {
if (a == b) return a;
int cnt = 0;
temp++;
while (cnt <= 1000) {
if (a != 0) {
if (check[a] == temp)
return a;
check[a] = temp;
a = parent[a].first;
}
if (b != 0) {
if (check[b] == temp)
return b;
check[b] = temp;
b = parent[b].first;
}
if (a == b && a == 0) return 0;
cnt++;
}
}
int count(int a, int b) {
unordered_set<int> colors;
int commonP = findCommonParent(a, b);
while (a != commonP) {
colors.insert(parent[a].second);
a = parent[a].first;
}
while (b != commonP) {
colors.insert(parent[b].second);
b = parent[b].first;
}
return (int)colors.size();
}
void paint(int a, int b, int c) {
int commonP = findCommonParent(a, b);
while (a != commonP) {
parent[a].second = c;
a = parent[a].first;
}
while (b != commonP) {
parent[b].second = c;
b = parent[b].first;
}
}
void func(int op) {
int a, b; sc("%d %d", &a, &b);
if (op == 1) { //paint
int c;
sc("%d", &c);
paint(a, b, c);
}
else if (op == 2) { // move
parent[a].first = b; //a์ ๋ถ๋ชจ๋ฅผ b๋ก ๋ฐ๊พผ๋ค!
}
else { // count
int cnts = count(a, b);
printf("%d\n", cnts);
}
}
int main() {
sc("%d %d", &N, &K);
parent[0].first = -1;
for (int k = 0;k < K;k++) {
// ์ฐ์ฐ์ ์ข
๋ฅ : (1, paint) (2, move) (3, count)
int op;
sc("%d", &op);
func(op);
}
return 0;
}
๊ฒฐ๊ณผ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 11437, 11438. LCA 1,2 (0) | 2021.07.27 |
---|---|
[๋ฐฑ์ค/C++] 12888. ์์ ์ด์ง ํธ๋ฆฌ ๋๋ก ๋คํธ์ํฌ (0) | 2021.07.20 |
[๋ฐฑ์ค/C++] 19535. ใทใทใทใ (0) | 2021.07.13 |
[๋ฐฑ์ค/C++] 3584. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต์กฐ์ (0) | 2021.07.06 |
[๋ฐฑ์ค/C++] 5052. ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2021.07.06 |