๐ ๋ฌธ์ ๋ชฉ๋ก
- [๐ฅ2] 11724 - ์ฐ๊ฒฐ ์์์ ๊ฐ์
- [๐ฅ2] 1260 - BFS์ DFS
- [๐ฅ3] 1937 - ์์ฌ์์ด ํ๋ค
๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์์ฑํ ๊ฒ์ผ๋ก ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
1. ์ฐ๊ฒฐ ์์์ ๊ฐ์
์ ์ ์ ๊ฐ์์ (์ฐ๊ฒฐ๋ ๋ ์ ์ ์ผ๋ก ํํ๋)๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ง๋ฉด, ์ฐ๊ฒฐ ๋ฉ์ด๋ฆฌ๊ฐ ๋ช๊ฐ์ธ์ง๋ฅผ ์ธ๋ ์ ํ์ ์ธ DFS ๋ฌธ์ ๋ค.
๋ฌธ์ ์์ ๋์์๋ฏ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์ฅ ์ ์์ชฝ ๋ชจ๋ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํ๊ณ ,
๊ทธ๋ฃน ๊ฐ์๋ฅผ ์ธ๋ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ์ ์ ์ ๋ํ์ฌ DFS๋ฅผ ํด ์ฃผ๋ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํด ์ฃผ์ด ์ด์ ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ ํจ์คํ๋๋ก ํ๋ค.
๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ทธ๋ํ์ ํํ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ, ๋์ ์๋ฐ๋ ํน์ฑ์ ๊ฐ์ง๋ฏ๋ก ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ์์ ์ ํํด์ผ ํ๋ค.
(V: ์ ์ ๊ฐ์, E: ๊ฐ์ ๊ฐ์)
์ธ์ ํ๋ ฌ: O(V^2)
๋ชจ๋ ์ ์ ์ ๋ํ์ฌ DFS()๋ฅผ ํธ์ถ => O(V)
ํ ์ ์ ์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ํํ ๊ฒฝ์ฐ ๋ชจ๋ V๊ฐ์ ์ ์ ์ ๋ํด ์ฐ๊ฒฐ๋์๋์ง ์ฒดํฌ => O(V)
Good: ์ด๋ค ๊ฐ์ ์ด ์กด์ฌํ๋์ง์ ๋ํ ์ ๋ณด ์ ๊ทผ์ด ๋น ๋ฅด๋ค. ์ฆ ๋ ์ ์ ๊ฐ ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ๋ฐ๋ก ์ ์ ์๋ค.(O(1))
Bad: ๊ฐ์ ์ด ์ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์ข์ง ์๊ณ ๋ถํ์ํ ํ์ ์๊ฐ์ด ๋ง์์ง๋ค.์ธ์ ๋ฆฌ์คํธ: O(V+E)
๋ชจ๋ ์ ์ ์ ๋ํ์ฌ DFS()๋ฅผ ํธ์ถ => O(V)
ํ ์ ์ ์ ์ฐ๊ฒฐ๋(=๋ฆฌ์คํธ์ ์ ์ฅ๋) ์ ์ ๋ง์ ์ํ => ์ด O(E)
Good: ๊ฐ์ ์ด ์ ์ ๋ ์ฐ๊ฒฐ๋ ์ ์ ์ ๋ณด๋ง์ด ์ ์ฅ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์ข๋ค.
Bad: ์ด๋ค ๊ฐ์ ์ ์กด์ฌ์ฌ๋ถ๋ฅผ ์๋ ค๊ณ ํ ๋ ๋ฆฌ์คํธ๋ฅผ ์ผ์ผ์ด ๋ค์ ธ์ผ ํ๋ฏ๋ก ๋น๊ต์ ์ ๊ทผ์ด ๋๋ฆฌ๋ค.(์ต์ ์ ๊ฒฝ์ฐ O(V))
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ ์ด ๋ณ๋ก ์๋ ํฌ์ ๊ทธ๋ํ(sparse graph)์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ ์ธ์ ํ๋ ฌ๋ณด๋ค ์ธ์ ๋ฆฌ์คํธ๊ฐ ์ ํฉํ๊ฒ ์ง๋ง
๊ฐ์ ์ด ๋ง์ ๋ฐ์ง ๊ทธ๋ํ(dense graph)์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ด ๋น์ทํด์ง ๊ฒ์ด๊ณ , ๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์ค๋ฒํค๋๋ ๊ฐ์ ํ์ ์๊ฐ์ ๊ณ ๋ คํ์ ๋ ์คํ๋ ค ์ธ์ ํ๋ ฌ์ด ๋์ ๊ฒ์ด๋ค.
์๋ ์ฝ๋์์๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ผ๋ก ์ ์ฅํ์ง๋ง boolํ 2์ฐจ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ intํ 2์ฐจ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ์ธ์ ๋ฆฌ์คํธ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ด ์ ๊ฒ ๋์๋ค. ๋ง์ฝ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์๊ฑฐ๋ ํด์ ์ธ์ ๋ฆฌ์คํธ์ ๊ฐ์ intํ์ผ๋ก ์ ์ฅํ๋ค๋ฉด ์ฌ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ด ๋ ํฌ๊ฒ ๋์ฌ ๊ฒ์ด๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<vector>
using namespace std;
bool isVisited[1001] = { false };
int cnt = 0;
vector<vector<bool>> adj;
void dfs(int v) {
isVisited[i] = true;
for (int i = 1; i < adj[v].size(); i++) {
if (adj[v][i] && !isVisited[i]) {
dfs(i);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
cin >> n >> m;
adj.assign(n + 1, vector<bool>(n+1, false));
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u][v] = true;
adj[v][u] = true;
}
for (int i = 1; i <= n; i++) {
if (!isVisited[i]) {
dfs(i);
cnt++;
}
}
cout << cnt;
}
2. BFS์ DFS
์ ๋ชฉ์ด ๊ณง ๋ด์ฉโฆ์ ์ ๊ฐ์ N, ๊ฐ์ ๊ฐ์ M, ์์ ์ ์ V์ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉด DFS์ BFS๋ฅผ ์ฌ์ฉํด ํ์ ์์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<queue>
using namespace std;
bool isVisited[1001]{ false };
bool isConnected[1001][1001]{ false };
int n;
void dfs(int v) {
cout << v << " ";
isVisited[v] = true;
for (int i = 1; i <= n; i++) {
if (isConnected[v][i] && !isVisited[i]) {
dfs(i);
}
}
}
void bfs(int v) {
queue<int> q;
isVisited[v] = true;
q.push(v);
while (!q.empty()) {
int cur = q.front();
cout << cur << " ";
q.pop();
for (int i = 1; i <= n; i++) {
if (isConnected[cur][i] && !isVisited[i]) {
isVisited[i] = true;
q.push(i);
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m, v;
cin >> n >> m >> v;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
isConnected[a][b] = true;
isConnected[b][a] = true;
}
dfs(v);
cout << "\n";
fill_n(isVisited, n+1, false);
bfs(v);
}
3. ์์ฌ์์ด ํ๋ค
๊ฐ์ฅ ๊น์ ํ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ํ ์ง์ญ์์ ๋ค๋ฅธ ์ง์ญ์ผ๋ก ์ด๋ ์ ํ์ฌ ์์น์ ์/ํ/์ข/์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋ํ๋ฉฐ, ์ด๋๊ฐ๋ฅ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
1
2
โ ์ฃผ์ด์ง ๋งต(nรn) ๋ด
โก ํ์ฌ ์ง์ญ์ ๊ฐ๋ณด๋ค ํฐ ๊ณณ
์ด๋ ๊ฒ ๋ ์ด์ ์ด๋ํ ์ ์์ ๋๊น์ง ์ด๋ํ์ ๋ ์ด๋ ์นธ์์ ์์ํด์ผ ๊ฐ์ฅ ๋ง์ ์นธ์ ๋ฐฉ๋ฌธํ ์ ์๋์ง๋ฅผ ์ฐพ์ ์ต๋ ์ด๋ ์นธ ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค. ๋ค๋ง ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค.
์ฒ์์ ์ ์ถํ ์ฝ๋์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋๋ฐ, ๋ถํ์ํ ๋ฐ๋ณต ์ฐ์ฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ฐจํผ ์ด๋ค ์นธ์ ๋ํ ์ต๋ ์ด๋ ํ์๋ ์ ํด์ ธ ์์ผ๋ฏ๋ก ํ๋ฒ DFS๋ฅผ ์ํํด์ ๊ทธ ์นธ์ ๋ํ ์ต๋ ์ด๋ ํ์๋ฅผ ๊ตฌํ๋ค๋ฉด ์ดํ ์ฌ๋ฐฉ๋ฌธ ์ DFS๋ฅผ ๋ ํ ํ์๊ฐ ์๋ค.
(ํ์ฌ ๊ฒฝ๋ก์์๋ ์ฌ๋ฐฉ๋ฌธํ ์ผ์ด ์์ง๋ง ๋ค๋ฅธ ๊ฒฝ๋ก์์ ์ฌ๋ฐฉ๋ฌธํ ์ ์๋ค.)
์ฆ DP๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ์ฅ(๋ฉ๋ชจ์ด์ ์ด์
)ํด๋๊ณ , ๋ค์์ ๋ค์ ๋ฐฉ๋ฌธํ ๋ ์ ์ฅํด๋์ ๊ฐ๋ง์ ๋ฐํํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฐ์์ผ๋ก ์ด๋ค ์นธ์์ ์ํ์ข์ฐ๋ฅผ ํ์ํ์ฌ ์ด๋ ๊ฐ๋ฅํ ์นธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ 1์ ๋ํ ๊ฐ์ด ํ์ฌ ์นธ์ ์ต๋ ์ด๋ ์นธ ์๊ฐ ๋๋ค.
DP๋ฅผ ์ฌ์ฉํ์ ๋ ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด ๋๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<queue>
using namespace std;
int n;
int map[501][501];
int cnt[501][501]{ 0 };
int dir[4][2]{ {-1,0},{1,0},{0,-1},{0,1} };
int dfs(int x, int y) {
if (cnt[x][y] == 0) {
for (int i = 0; i < 4; i++) {
int next_x = x + dir[i][0];
int next_y = y + dir[i][1];
if (next_x > 0 && next_x <= n && next_y > 0 && next_y <= n &&
map[x][y] < map[next_x][next_y]) {
int tmp = dfs(next_x, next_y) + 1;
if (cnt[x][y] < tmp) cnt[x][y] = tmp;
}
}
}
return cnt[x][y];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int max = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> map[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int tmp = dfs(i, j);
if (max < tmp) max = tmp;
}
}
cout << max+1;
}