๐ก DFS์ ๋ํด์ ์์๋ณด์.
C++๋ก ๊น์ด ์ฐ์ ํ์(DFS)์ ์์ ๋ณด๊ณ ๊ตฌํํด๋ณด์.
DFS๋ Depth-First Search์ ์ฝ์๋ก '๊น์ด ์ฐ์ ํ์'์ ์๋ฏธํฉ๋๋ค.
์ํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ์๋ฃ๊ตฌ์กฐ์์ ๋ฃจํธ ๋
ธ๋ ํน์ ์์์ ๋
ธ๋์์ ์์ํด์
๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ์ ๋ํ ์์ ํ์ ๊ธฐ๋ฒ ์ค ํ๋์
๋๋ค.
์ฃผ๋ก, ์ฌ๊ทํจ์ ๋๋ Stack๋ก ๊ตฌํํฉ๋๋ค.

DFS์ ์ ์ ๋
ธ๋์ ๊ฐ์๋ฅผ N, ๊ฐ์ ์ ๊ฐ์๋ฅผ E๋ผ๊ณ ํ ๋,
์ธ์ ํ๋ ฌ์์๋ O(Nยฒ)์,
์ธ์ ๋ฆฌ์คํธ์์๋ O(N+E)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
ํ ๊ฒฝ๋ก์์ ๋ ธ๋๋ค๋ง์ ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก ์ ์ฅ ๊ณต๊ฐ์ ์์๊ฐ ๋น๊ต์ ์ ์ต๋๋ค.
๋ชฉํ ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์์ ๊ฒฝ์ฐ ํด๋ฅผ ๋นจ๋ฆฌ ๊ตฌํ ์ ์์ต๋๋ค.
๋ ธ๋์ ๋ํ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ์ง ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์์ต๋๋ค.
์ด๋ ๊ฐ ๋
ธ๋์ ๋ํ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ฌ ํด๊ฒฐํ๊ณ ,
์ง์ ๋ ๊น์ด๊น์ง๋ง ํ์ํ๋ ์กฐ๊ธฐ ์ข
๋ฃ๊ฐ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
๋ํ ์ป์ด์ง ํด๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค๋ ๋ณด์ฅ์ด ์์ต๋๋ค.
๋
ธ๋์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง 2์ฐจ์ ๋ฒกํฐ A๊ฐ ์๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
| ๋ ธ๋ ๋ฒํธ | ์ธ์ ๋ ธ๋ |
|---|---|
| 1 | 2, 3, 4 |
| 2 | 1, 4 |
| 3 | 1, 4 |
| 4 | 1, 2, 3 |
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ bool ๋ฒกํฐ visited๋ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
static vector<bool> visited(N+1,false);
์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ์ฌ DFS๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
1๋ฒ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค.
void DFS(int node);
int main()
{
DFS(1);
}
void DFS(int node)
{
visited[node] = true;
for (int i : A[node])
{
if (!visited[i])
{
visited[i] = true;
DFS(i);
}
}
}
๊ธฐ๋ณธ์ ์ธ DFS ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ต๋๋ค.
์ด์ ๋ฏธ๋ก ์ฐพ๊ธฐ, ๋จ์ ์ ์ฐพ๊ธฐ, ๋จ์ ์ ์ฐพ๊ธฐ, ์์ ์ ๋ ฌ ๋ฑ์ ๋ฌธ์ ์ ๋ง๊ฒ ๊ฐ ์กฐ๊ฑด์ ์ถ๊ฐ๋ก DFS ํจ์ ๋ด๋ถ์ ๊ตฌํํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด์์ผ๋ก DFS์ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ๋ํด์ ์ ๋ฆฌํ์์ต๋๋ค.
์ถํ DFS ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋ฉ ํ ์คํธ๋ฅผ ํ์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.