๋ฐฑ์ค 1152๋ฒ : https://www.acmicpc.net/problem/1260
โ ๋ฌธ์ ์ค๋ช
์ด ๋ฌธ์ ๋ DFS BFS๋ฅผ ๋ค๋ฃจ๋ ๋ฌธ์ ๋ก
์ ์ ์ ๊ฐ์ N, ๊ฐ์ ์ ๊ฐ์ M, ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๋ฅผ ์ ๋ ฅํ๊ณ ,
์๋ฐฉํฅ ๊ฐ์ ์ด๋ผ๋ ๊ฐ์ ํ์ ์ฒซ์งธ์ค์ DFS, ๋์งธ์ค์ BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
โ ์๊ณ ๋ฆฌ์ฆ ์ค๋ช
๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด,
DFS(๊น์ด์ฐ์ ํ์)๋ ์คํ, BFS(๋๋น์ฐ์ ํ์)๋ ํ๋ก ๊ตฌํํ๋ค๊ณ ๋ณผ ์ ์๋ค.
DFS๋ ์ ์ V๋ฅผ ์์์ผ๋ก ๊ทธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ๋ชจ๋ ์ฐพ์ ํ,
๋ ์ด์ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์์ผ๋ฉด ๋น ์ ธ๋์ ๋ค์ ์ ์ ์ ํ์ํด์ผ ํ๋ค.
๊ทธ์ ๋ฐํด BFS๋ ์ ์ V์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ ๋ฒจ์ ๋ชจ๋ ์ ์ ๋ค์ ํ์ํ๊ณ ,
๊ทธ ๋ค์ ๋ ๋ฒจ์ ์ ์ ๋ค์ ๋ชจ๋ ํ์ํ๋ ์์๋ก ์งํ๋๋ค.
DFS๋ ์ ์ V๋ฅผ ์์์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ฐจ๋ก๋ก ์คํ์ pushํ๊ณ ,
ํ์ํ ๋๋ง๋ค ์คํ์์ popํ๋ ํ์์ผ๋ก ์งํํ๋ฉด ๋๋ค.
BFS๋ ์ ์ V์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ ๋ฒจ์ ์ ์ ๋ค์ ์ฐจ๋ก๋ก ํ์ pushํ๊ณ ,
์์์๋ถํฐ ์ฐจ๋ก๋ก popํ๋ ํ์์ผ๋ก ์งํํ๋ฉด ๋๋ค.
โก [ DFS (๊น์ด์ฐ์ ํ์) ]
1. ์ ์ V๋ก ๋ค์ด๊ฐ
2. ์ ์ V์์ ์ ์ผ ์์ ์ A๋ก ๋ค์ด๊ฐ
-1) A์์ ์ ์ผ ์์ ์ A-1๋ก ๋ค์ด๊ฐ
-2) A-2, A-3, A-4 ... ์ญ์ญ ๋ค์ด๊ฐ์ ๋์ด์ ์ฐ๊ฒฐ๋ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๋์ด
-3) A-4์์ ๋์๋ค๊ณ ๊ฐ์ ํ๋ฉด A-3๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ฐพ์๊ฐ
-4) A-3์ ๋์ค๋ฉด A-2์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ, A-2๋ฅผ ๋์ค๋ฉด A-1๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ญ์ญ ์ฐพ์๊ฐ
3. ๊ฒฐ๊ตญ A๋ฅผ ๋ค ํ์ํ๋ฉด ์ ์ V์ ์ฐ๊ฒฐ๋๋ฉฐ, A๋ค์์ผ๋ก ์์ ์ B ํ์
4. ๋ชจ๋ ๊ฐ์ ์ ํ์ํ ๋๊น์ง 2๋ฒ ํ์ ๋ฐ๋ณต
โก [ BFS (๋๋น์ฐ์ ํ์) ]
1. ์ ์ V๋ก ๋ค์ด๊ฐ
2. ์ ์ V์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ A,B,C....๋ฅผ ์์ ์๋ถํฐ ํ์
-1) ๊ทธ ๋ค์์ผ๋ก A,B,C...์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ A-1, B-1, C-1์ ์ฐจ๋ก๋ก ํ์
-2) A-2, B-2, C-2... -> A-3, B-3, C-3... ์ด๋ฐ์์ผ๋ก ๊ณ์ํด์ ๊ฐ์ ๋ ๋ฒจ์ ์ ์ ๋ค์ ํ์
3. ๋ชจ๋ ๊ฐ์ ์ ํ์ํ ๋๊น์ง 2๋ฒ ํ์ ๋ฐ๋ณต
โ ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
// n - ์ ์ ์ ๊ฐ์
// m - ๊ฐ์ ์ ๊ฐ์
// v - ์ ์ ์ ๋ฒํธ
int n, m, v;
int arr[1000][1000] = { 0 }; // ์๋ฐฉํฅ ๊ฐ์ (a,b), (b,a) ๋ชจ๋ ์ ์ฅํ ์ ์๋๋ก 2์ฐจ์ ๋ฐฐ์ด
int idx_BFS[1000] = { 0 }; // BFS ํ์ ์ฌ๋ถ ํ์ธ์ฉ
int visit_DFS[1000] = { 0 }; // DFS ํ์ ์ฌ๋ถ ํ์ธ์ฉ
void start_DFS(int now) {
printf("%d ", now); // ํ์ํ ์ ์ ์ถ๋ ฅ
/* ์ ์ now ํ์ํ๋ค๊ณ ํ์ */
visit_DFS[now - 1] = 1; // index๋ 0๋ถํฐ๊ธฐ ๋๋ฌธ์ now-1
/* ํ์ํ ์ ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ผ ์์ ์ ํ์ ์์ */
for (int i = 0; i < n; i++) {
/* ๋ฌด์ธ๊ฐ ๊ฐ์ด ์๊ณ ํ์ํ ์ ์๋ค๋ฉด */
if ((arr[now - 1][i] == 1) && (visit_DFS[i]) == 0)
start_DFS(i + 1); // ๊ฑ๋ฅผ ํ์ํ๋๋ก ์ฌ๊ท ํจ์๋ก ๋ณด๋ด์ค
}
return;
}
void start_BFS() {
static int cnt = 0;// ํ์ํ ์ ์ ์ ๊ฐ์
static int idx = 0;// ํ์ํ ์ ์ ์ index
int now = v; // ํ์ํ ์ ์ ์ ์ฅ
int *next = (int*)calloc(n, sizeof(int)); // ๋ค์ ํ์ํ ์ ์ ์ ์ฅ
printf("\n%d", now); // ์์ ์ ์ ์ถ๋ ฅ
/* ๋ชจ๋ ์ ์ ํ์ํ๋ฉด ํ์ถ */
while (cnt < n - 1) {
for (int i = 0; i < n; i++) { // ๊ฐ์ ๋ ๋ฒจ ํ์
/* ํด๋น ์ ์ ๊ณผ ์ง์ ์ฐ๊ฒฐ๋ ๊ฐ์ด ์๋ค๋ฉด */
if (arr[now - 1][i] == 1 && idx_BFS[i] == 1) {
printf(" %d", i + 1); // ๊ฐ์ ๋ ๋ฒจ๋ค ์ถ๋ ฅ
idx_BFS[i] = 0; // ๋ค์ ํ์ ๋ชปํ๊ฒ 0์ผ๋ก ๋ฐ๊ฟ
next[cnt] = i + 1; // ๊ฐ์ ๋ ๋ฒจ๋ค ์ ์ฅ
cnt++; // ์ธ๋ฑ์ค ++
}
}
/*
์ฒ์ ์ ์ ์ด๋ ์ฐ๊ฒฐ๋ ๊ฐ์ ์์ผ๋ฉด ๋ฐ๋ก break
๊ฐ์ ํ๋์ฌ๋ break
*/
if ((now == v && cnt == 0) || (now == v && cnt == 1))
break;
else {
// ์ด์ ๊ฐ์ ๋ ๋ฒจ ๋ค ํ์ํจ
idx_BFS[now - 1] = 0; // ์ด ๋ ๋ฒจ์ ์ด์ ํ์ํจ
now = next[idx]; // ๋ค์ ์๋ฅผ ํ์ํ ์ ์ ์ผ๋ก ์ ์ฅ
idx++; // ์์ ๊ฐ์ ๋ ๋ฒจ์์ ๊ทธ ๋ค์์ผ๋ก ์์ ์ ์
}
}
free(next);
return;
}
int main(void) {
scanf("%d%d%d", &n, &m, &v);
/* ๊ฐ์ ์ ์ซ์๋งํผ ๋ฐ๋ณต๋ฌธ */
int a, b; // ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
/* ์๋ฐฉํฅ ๊ฐ์ ์ด๋ฏ๋ก ๋ ๋ค ์ ์ฅ */
arr[a - 1][b - 1] = 1; // (a,b)๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์๋ค๊ณ ๋ฐ๊พธ๊ธฐ
arr[b - 1][a - 1] = 1; // (b,a)๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์๋ค๊ณ ๋ฐ๊พธ๊ธฐ
/* ์ผ๋จ ์ด ์ธ๋ฑ์ค์๋ ์ต์ 1๊ฐ ์ด์์ ๊ฐ์ด ์์ */
idx_BFS[a - 1] = 1, idx_BFS[b - 1] = 1;
}
if (m == 0) // ๊ฐ์ ์ด 0๊ฐ์ด๋ฉด
printf("%d\n%d", v, v);
else {
start_DFS(v); // ๊น์ด ์ฐ์ ํ์
start_BFS(); // ๋๋น ์ฐ์ ํ์
}
return 0;
}
ex) N = 4
idx | 0 | 1 | 2 | 3 |
0 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 |
a=1, b=2๋ผ๊ณ ๊ฐ์ ํ์ ๋ (a,b) (b,a) ๋ชจ๋ ์ ์ฅํ์ฌ
1์ ๋จผ์ ํ์ํ๋ฉด 2๋ก ์ฐ๊ฒฐ,
2๋ฅผ ๋จผ์ ํ์ํ๋ฉด 1๋ก ์ฐ๊ฒฐํ์ฌ ์๋ฐฉํฅ์ผ๋ก ํ์ํ ์ ์๋๋ก ๋ง๋ฆ
https://github.com/2hyunjinn/Baekjoon/blob/main/Baekjoon_1260.cpp
'๐ STUDY > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C / C++] ๋ฐฑ์ค 2884๋ฒ - ์๋์๊ณ (0) | 2022.03.21 |
---|---|
[C / C++] ๋ฐฑ์ค 2446๋ฒ - ๋ณ์ฐ๊ธฐ_9 (0) | 2022.03.21 |
[C / C++] ๋ฐฑ์ค 1316๋ฒ - ๊ทธ๋ฃน ๋จ์ด ์ฒด์ปค (1) | 2022.03.19 |
[C / C++] ๋ฐฑ์ค 1152๋ฒ - ๋จ์ด์ ๊ฐ์ (0) | 2022.03.19 |
[C / C++] ๋ฐฑ์ค 1110๋ฒ - ๋ํ๊ธฐ ์ฌ์ดํด (0) | 2022.03.14 |