[๋ฌธ์ ]
[๋ฌธ์ ์ค๋ช
]
์ฌํ๋ง ์๋น์ค(SNS)์ ์ํ ์ฌ๋๋ค์ ์ผ๋ฆฌ ์๋ตํฐ์ด๊ฑฐ๋ ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋๋ค. ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋ ์ฌ๋๋ค์ ์์ ์ ๋ชจ๋ ์น๊ตฌ๋ค์ด ์ผ๋ฆฌ ์๋ตํฐ์ผ ๋๋ง ์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ธ๋ค. ์ด๋ค ์์ด๋์ด๋ฅผ ์ฌํ๋ง ์๋น์ค(SNS)์์ ํผ๋จ๋ฆฌ๊ณ ์ ํ ๋, ๊ฐ๋ฅํ ํ ์ต์์ ์์ ์ผ๋ฆฌ ์๋ตํฐ๋ฅผ ํ๋ณดํ์ฌ ๋ชจ๋ ์ฌ๋์ด ์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ด๊ฒ ํ์.
์ผ๋ฆฌ์ด๋ตํฐ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ผ๋ฆฌ ์ด๋ตํฐ๊ฐ ์๋๋ฉด, ๋ชจ๋ ์น๊ตฌ๋ค์ด ์ผ๋ฆฌ ์ด๋ตํฐ์ผ ํ๋ค.
- ์ผ๋ฆฌ ์ด๋ตํฐ์ด๋ฉด, ์ฃผ๋ณ ์น๊ตฌ๋ค์ด ์ผ๋ฆฌ ์ด๋ตํฐ๊ฑฐ๋ ์๋์ด๋ ๋๋ค.
์๋ฅผ ๋ค์ด, 8๋ช ์ ์ฌ๋์ผ๋ก ์ด๋ฃจ์ด์ง ์์ ์น๊ตฌ ๊ด๊ณ ํธ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์. 2, 3, 4๋ฒ ๋ ธ๋๊ฐ ํํํ๋ ์ฌ๋๋ค์ด ์ผ๋ฆฌ ์๋ตํฐ๋ผ๋ฉด, ์ผ๋ฆฌ ์๋ตํฐ๊ฐ ์๋ ์ฌ๋๋ค์ ์์ ์ ๋ชจ๋ ์น๊ตฌ๊ฐ ์ผ๋ฆฌ ์๋ตํฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์์ด๋์ด๋ฅผ ๋ฐ์๋ค์ธ๋ค.
์ฃผ์ด์ง ์น๊ตฌ ๊ด๊ณ ๊ทธ๋ํ์์ ์์ด๋์ด๋ฅผ ์ ํํ๋๋ฐ ํ์ํ ์ผ๋ฆฌ ์๋ตํฐ์ ์ต์ ์๋ 3์ด๋ค.
[๋ฌธ์ ํ์ด]
DP๋ฅผ ์ด์ฉํ ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผํ๋ค.
leaf๋
ธ๋๋ถํฐ or root๋
ธ๋๋ถํฐ ์ผ๋ฆฌ์ด๋ตํฐ์ ์กฐ๊ฑด์ ํ๋ณ&๊ฐฑ์ ํ๋ฉด์ ๋ง์ง๋ง ๋
ธ๋๊น์ง ์ ๋ถ ํ์ํด์ผ, ์ผ๋ฆฌ์ด๋ตํฐ์ ์ต์ ์๋ฅผ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ root ๋
ธ๋๋ถํฐ DFS๋ก leaf ๋
ธ๋๊น์ง ํ์ํ๋ค.
1) ์ฐ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ํธ๋ฆฌ๋ ๊ฐ ๋ ธ๋๋น ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ ๋ถ ๋์ ์ผ๋ก ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํ๋ฏ๋ก ๋ฒกํฐ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
vector<int> tree[MAX];
๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ๊ฐ์ ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐํด์คฌ๋ค.
tree[n].push_back(m);
tree[m].push_back(n);
2) DP๋ leaf๋ ธ๋๊น์ง ํ์ํด์ผํ๋ฏ๋ก DFS๋ฅผ ์ฌ์ฉํ๊ณ , DP, visited ๋ฐฐ์ด๋ก ํํํ๋ค.
int dp[MAX][2];
bool visited[MAX];
3) ๊ทธ๋ฆฌ๊ณ root ๋ ธ๋๋ถํฐ DFS๋ก leaf๋ ธ๋๋ฅผ ์ฐพ๋๋ค. ์ด ๋, ์์ ์ด ์ผ๋ฆฌ์ด๋ตํฐ์ผ ๋์ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๋๋ฅผ ์ ์ฅํด์ค๋ค. leaf๋ ธ๋์์ ๋ค์ ๋์์ฌ ๋, ์ด ๊ฐ์ ๋ํด์ฃผ๋ฉด์ ์ต์๊ฐ์ ์ฐพ์ ๊ฑฐ๋ค.
dp[current_node][0] = 0; //๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋๋ฉด ์ผ๋ฆฌ์ด๋ตํฐ์ ์๋ฅผ ๋๋ ค์ฃผ์ง ์๋๋ค.
dp[current_node][1] = 1; //๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๋ผ๋ฉด ์ผ๋ฆฌ์ด๋ตํฐ์ ์๋ฅผ ํ๋ ๋๋ ค์ค๋ค.
4) ์ฆ, ๋ง์ง๋ง leaf๋ ธ๋์ ๋๋ฌํ๋ค๋ฉด(์ฐ๊ฒฐ๋ ์์๋ ธ๋๊ฐ ๋์ด์ ์๋ค๋ฉด) DFS๋ฅผ returnํ๋ฉด์ ํ์ฌ ๋ ธ๋๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ ์ผ ๋์ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๋๋ฅผ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ค๋ค.
dp[current_node][0] += dp[neighbor_node][1];//๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋๋ฉด, ๋ด ์น๊ตฌ๋ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ์ผ ํ๋ค
dp[current_node][1] += min(dp[neighbor_node][0], dp[neighbor_node][1]);//๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๋ฉด, ์น๊ตฌ๋ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ๋ ๋๊ณ ์๋์ด๋ ๋๋ค.
5) ๋ง์ง๋ง์ผ๋ก root๋
ธ๋์ ๋ค๋ฌํ๋ค๋ฉด DFS ํ์ ๋!
root๋
ธ๋๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ ์ผ ๋์ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๋๋ฅผ ๋น๊ตํด์ ์ต์๊ฐ์ ์ถ๋ ฅํด์ค๋ค.
min(dp[1][0], dp[1][1]);
[์ฝ๋]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 1000001;
vector<int> tree[MAX];
int dp[MAX][2];
bool visited[MAX];
void SearchEarlyAdaptorNum(int);
int main() {
int node_num = 0;
cin >> node_num;
int n = 0, m = 0;
for (int i = 0; i < node_num; i++) {
cin >> n >> m;
tree[n].push_back(m);
tree[m].push_back(n);//์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ
}
SearchEarlyAdaptorNum(1);//root๋
ธ๋๋ถํฐ DFS๋ก leaf๋
ธ๋๊น์ง ํ์
cout << min(dp[1][0], dp[1][1]);//๋ง์ง๋ง root๋
ธ๋์ ๊ฐ ์ถ๋ ฅ
return 0;
}
void SearchEarlyAdaptorNum(int current_node) {
visited[current_node] = true;
dp[current_node][0] = 0; //๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๋. ์ผ๋ฆฌ์ด๋ตํฐ 1๋ช
์ถ๊ฐ์ํจ.
dp[current_node][1] = 1; //๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ ์ผ ๋. ์ผ๋ฆฌ์ด๋ตํฐ 1๋ช
์ถ๊ฐ.
for (int i = 0; i < tree[current_node].size(); i++) {
int neighbor_node = tree[current_node][i];
if (!visited[neighbor_node]) {
SearchEarlyAdaptorNum(neighbor_node);//DFS
//์์๋
ธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ญ์ผ๋ก ์ฑ์์ฃผ๋ ๊ณผ์
dp[current_node][0] += dp[neighbor_node][1];//๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋๋ฉด, ๋ด ์น๊ตฌ๋ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ์ผ ํ๋ค
dp[current_node][1] += min(dp[neighbor_node][0], dp[neighbor_node][1]);//๋ด๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๋ฉด, ์น๊ตฌ๋ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ๋ ๋๊ณ ์๋์ด๋ ๋๋ค.
}
}
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][BAKJOON][์ํ] 1541๋ฒ ์์ด๋ฒ๋ฆฐ ๊ดํธ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
---|---|
[C++][BAEKJOON][Bruteforce] 2580๋ฒ ์ค๋์ฟ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
[BAEKJOON][C++][์๋ฎฌ๋ ์ด์ ] 16236๋ฒ ์๊ธฐ์์ด (0) | 2021.09.25 |
[C++][ํ๋ก๊ทธ๋๋จธ์ค][Heap] ๋ ๋งต๊ฒ (0) | 2021.09.22 |
[C++][BAEKJOON][๋ธ๋ฃจํธํฌ์ค] 3085๋ฒ ์ฌํ ๊ฒ์ (0) | 2021.09.21 |