๐ง ๊ทธ๋ํ (Graph)
๊ทธ๋ํ๋ ์ ์ (vertex)๋ค๊ณผ ๊ฐ์ (edge)๋ค๋ก ์ด๋ฃจ์ด์ง ๊ตฌ์กฐ๋ก์จ, ๊ธฐํธ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ํํํฉ๋๋ค.
$$G = (V(G), E(G))$$
$V$ ๋ ์ ์ ์, $E$ ๋ ๊ฐ์ ์ ์๋ฏธํฉ๋๋ค.
๐ง Simple Graph
Self loop ๋๋ Multiple Edge๋ฅผ ๊ฐ์ง์ง ์๋ ๊ทธ๋ํ๋ฅผ Simple Graph๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก๋ ์๋์ ๊ฐ์ต๋๋ค.
์์ผ๋ก ๋ฑ์ฅํ๋ ๋ชจ๋ ๊ทธ๋ํ๋, ํน๋ณํ ์ค๋ช ์ด ์๋ ์ด์ Simple Graph๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๐ง Directed Graph์ Undirected Graph
๊ทธ๋ํ์ ์ํ $E$ (๊ฐ์ )์ ๊ฐ ์์๋ค์ด ordered pair ์ฆ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ, ํด๋น ๊ทธ๋ํ๋ฅผ ๋ฐฉํฅ ๊ทธ๋ํ(Directed Graph)๋ผ๊ณ ํฉ๋๋ค.
๋ฐ๋๋ก $E$ (๊ฐ์ )์ ๊ฐ ์์๋ค์ด unordered pair ์ฆ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ, ํด๋น ๊ทธ๋ํ๋ฅผ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(Undirected Graph)๋ผ๊ณ ํฉ๋๋ค.
๐ง Adjacent
๋ ์ ์ $v,\; u$ ์ ๋ํ์ฌ $(v, u)\in E$ ์ผ ๋, ์ฆ ๋ ์ ์ ์ ์๋ ๊ฐ์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ,
$v$ ๋ $u$ ์ adjacent(์ธ์ ํ๋ค)๋ผ๊ณ ํํํฉ๋๋ค.
Undirected Graph์ ๊ฒฝ์ฐ $v$ ์ $u$ ๊ฐ adjacent ํ๋ค๋ฉด, $v$ ์ $u$ ์ญ์ adjacent ์ ๋๋ค.
๐ง Degree (์ฐจ์)
์ด๋ ํ ์ ์ $v$ ์ ๋ํ ์ฐจ์(degree)๋ ๊ทธ๋ํ $G$ ์์ $v$ ์ adjacentํ ์ ์ ์ ์๋ฅผ ์๋ฏธํฉ๋๋ค.
Directed Graph์ ๊ฒฝ์ฐ in-degree์ out-degree๋ฅผ ๋ฐ๋ก ์ ์ํ์ฌ ์ฌ์ฉํ์ง๋ง, ๊ณ ๋ คํ์ง ์๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง Subgraph (๋ถ๋ถ ๊ทธ๋ํ)
๊ทธ๋ํ $G = (V(G), E(G))$ ์์ ๊ทธ๋ํ $G$ ์ subgraph $G' = (V(G'), E(G'))$ ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํฉ๋๋ค.
1. $V(G') \subseteq V(G)$ : ์๋ธ๊ทธ๋ํ $G'$ ์ ์ํ๋ ์ ์ ๋ค์ ์งํฉ์, ๊ทธ๋ํ $G$ ์ ์ ์ ๋ค์ ๋ถ๋ถ์งํฉ์ด์ด์ผ ํฉ๋๋ค.
2. $E(G') \subseteq E(G) $ : ์๋ธ๊ทธ๋ํ $G'$ ์ ์ํ๋ ๊ฐ์ ๋ค์ ์งํฉ์, ๊ทธ๋ํ $G$ ์ ๊ฐ์ ๋ค์ ๋ถ๋ถ์งํฉ์ด์ด์ผ ํฉ๋๋ค.
3. $E(G')$ ์ ์ํ๋ ๋ชจ๋ ๊ฐ์ ๋ค์ $V(G')$ ์ ์ ์ ๋ค๋ง์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์๋ ์๋์ ๊ฐ์ต๋๋ค.
๐ง Walk(๋ณดํ), Trail, Path(๊ฒฝ๋ก), Circuit(ํ๋ก), Cycle(์ํ)
(ํด๋น ๋ถ๋ถ์ ์ ์๋ค์ ์ฑ ๋ง๋ค ๋ค๋ฅด๊ฒ ์ ์๋ ์ ์์ผ๋ฉฐ, ์ ๋ ์ ๊ฐ ์ฐธ๊ณ ํ๋ ์ฑ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.)
โ๏ธ Walk(๋ณดํ)
๊ทธ๋ํ์ ์ํ ๋ ์ ์ ์ ๊ณจ๋์ ๋, ๋ ์ ์ ์ด ์ด๋ป๊ฒ๋ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ๋ ์ ์ ์ฌ์ด์ ๋ณดํ์ด ์กด์ฌํ๋ค๊ณ ํํํฉ๋๋ค.
์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$v_1$ , $e_1$ , $v_2$ , $e_2$ , ..., $e_k$ , $v_k$ ๋ก ์ด์ด์ง๋,
์ ์ $v_1, \; v_2, \; ...$ ๊ณผ ๊ฐ์ $e_1, \; e_2\; ..$ ๊ฐ ์๋ก ๊ต์ฐจ๋๋ฉฐ ๋ํ๋๋ sequence(ํน์ alternating sequence)๋ฅผ ์๋ฏธํฉ๋๋ค.
์ ์ ์ฌ์ด๋ฅผ ์ด๋ํ๊ธฐ ์ํด์๋ ๊ฐ์ ์ด ๋ฐ๋์ ํ์ํ๋ฏ๋ก, ์ด์ฐ๋ณด๋ฉด ๋น์ฐํ ์ ์์ผ ์ ์์ต๋๋ค.
๋ณดํ(Walk)์ ์ ์ ๊ณผ ๊ฐ์ ์ด ๊ต์ฐจ๋์ผ ํ๋ค๋ ๊ฒ ์ธ์๋ ์ ์ฝ์กฐ๊ฑด์ด ์กด์ฌํ์ง ์์ต๋๋ค.
์์ผ๋ก ๋์ค๋ ๊ฐ๋ ๋ค์ ๋ณดํ์ ์ถ๊ฐ์ ์ธ ์ ์ฝ์กฐ๊ฑด์ด ๊ฑธ๋ฆฐ ๊ฐ๋ ๋ค์ ๋๋ค.
โ๏ธ Trail
์ ์ฝ์กฐ๊ฑด: ๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋๋ฉด ์๋ฉ๋๋ค.
์ ์ฝ์กฐ๊ฑด์ ํตํ Trail์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๋ Walk(๋ณดํ)์ ์๋ฏธํฉ๋๋ค.
โ๏ธ Path(๊ฒฝ๋ก)
์ ์ฝ์กฐ๊ฑด: ๊ฐ์ ์ ์ (Vertex)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋๋ฉด ์๋ฉ๋๋ค.
์ ์ฝ์กฐ๊ฑด์ ํตํ Path์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ ์ ์ (Vertex)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๋ Walk(๋ณดํ)์ ์๋ฏธํฉ๋๋ค.
Undirected Graph์์๋ Path์ธ ๊ฒฝ์ฐ Trail๋ฅผ ๋ง์กฑํ์ง๋ง, ๊ทธ ์ญ์ ์ฑ๋ฆฝํ์ง ์์ต๋๋ค.
(8์๋ฅผ ๊ทธ๋ฆฐ๋ค๊ณ ์๊ฐํด๋ณด์ธ์)
๐์๊ธฐ Tip
ํธํจ๋ ์ ๋ฒ๋
- ํธ(Trail) - ์ (Edge)๊ฐ ๋ฐ๋ณต๋์ง ์์
- ํจ(Path) - ๋ฒ(Vertex)๊ฐ ๋ฐ๋ณต๋์ง ์์
โ๏ธ Circuit(ํ๋ก)
์ ์ฝ์กฐ๊ฑด:
๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์์ผ๋ฉฐ,
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํด์ผ ํฉ๋๋ค.
์ ์ฝ์กฐ๊ฑด์ ํตํ Circuit(ํ๋ก)์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๊ณ , ์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํ Walk(๋ณดํ)๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๋ ๋ค์๊ณผ๋ ๊ฐ์ต๋๋ค.
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํ Trail์ ์๋ฏธํฉ๋๋ค.
โ๏ธ Cycle(์ํ)
์ ์ฝ์กฐ๊ฑด:
๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์์ผ๋ฉฐ,
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํด์ผ ํ๊ณ ,
์ด ๋ ์ ์ ์ ์ ์ธํ ๋๋จธ์ง ์ ์ ๋ค์ ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์์์ผ ํฉ๋๋ค.
์ ์ฝ์กฐ๊ฑด์ ํตํ Cycle(์ํ)์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ ๊ฐ์ (Edge)์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๊ณ ,
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํ๋ฉฐ,
์ด์ธ ๋๋จธ์ง ์ ์ ๋ค์ ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๋ Walk(๋ณดํ)๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๋ ๋ค์๊ณผ๋ ๊ฐ์ต๋๋ค.
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ด ๋์ผํ๋ฉฐ, ์ด์ธ ๋๋จธ์ง ์ ์ ์ ๋ฐ๋ณต๋์ง ์๋ Trail์ ์๋ฏธํฉ๋๋ค.
์์ ์ ์ (Vertex)๊ณผ ๋ง์ง๋ง ์ ์ ์ ์ ์ธํ๊ณ ๊ฐ์ ์ ์ ์ด ๋ ๋ฒ ์ด์ ๋ฐ๋ณต๋์ง ์๋ Circuit(ํ๋ก)์ ์๋ฏธํฉ๋๋ค.
์์
๐ง Connected Graph
(Directed Graph์ ๊ฒฝ์ฐ๋ ๋ค์์ ๋ฐ๋ก ์ ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.)
Undirected Graph $G = (V, E)$ ์์ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ๊ทธ๋ํ $G$ ๋ฅผ Connected Graph๋ผ ํํํฉ๋๋ค.
์์์ ์๋ก ๋ค๋ฅธ ๋ ์ ์ (vertex) $v, w \in V$ ์ ๋ํ์ฌ, $v$ ์์ $w$ ๋ก์ path๊ฐ ์กด์ฌํฉ๋๋ค.
์ด ๊ฒฝ์ฐ G๋ Connected ํ๋ค๊ณ ๋ ํํํฉ๋๋ค.
์์์ ๋ ์ ์ ์ ๊ณ ๋ฅด๋ ๊ฒ์ด๋ฏ๋ก, ๊ทธ๋ํ์ ์กด์ฌํ๋ ๋ชจ๋ ์ ์ ๋ํด์ ์๋ก๊ฐ์ path๊ฐ ์กด์ฌํด์ผ ํ๋ ๊ฒ์ ๋๋ค.
Connected ํ์ง ์์ ๊ทธ๋ํ๋ disconnected(๋น์ฐ๊ฒฐ)๋ผ๊ณ ํฉ๋๋ค.
๐ง ๊ทธ๋ํ์ ์๊ฐ๋ณต์ก๋
๊ทธ๋ํ๋ฅผ ์ฝ๋ ์์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ฆฌ์คํธ๋ ์กฐ๊ธ ํท๊ฐ๋ฆด ์๋ ์์ผ๋ฏ๋ก, ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ฌ์ง์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๊ทธ๋ํ์์ ํํด์ง ์ ์๋ ์ฌ๋ฌ ์ฐ์ฐ๋ค์ ๋ํ์ฌ, ๋ ๋ฐฉ๋ฒ๊ฐ์ ์๊ฐ ๋ณต์ก๋ ์ฐจ์ด๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐฐ์ด์ ์ ์ฅ | ๋ฆฌ์คํธ์ ์ ์ฅ | |
๊ณต๊ฐ(Space) | $O(n^{2})$ | $O(n + m)$ |
์ ์ $u$ ์ $v$ ๊ฐ ์ธ์ (adjacent)ํ์ง ํ์ธ | $O(1)$ | $O(deg(u))$ |
์ ์ $u$ ์ ์ธ์ (adjacent)ํ ๋ชจ๋ ์ ์ ํ์ธ | $O(n)$ | $O(deg(u))$ |
์ ์ $u$ ์ ์ฐจ์ ๊ตฌํ๊ธฐ | $O(n)$ | $O(deg(u))$ |
์ด์ ๋ถํฐ ๋์ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์๋, ๋ชจ๋ list์ ์ ์ฅ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง Reachability (์ ๊ทผ ๊ฐ๋ฅ์ฑ)
Undirected graph $G$ ์ ๋ ์ ์ (vertex) $u$, $v$ ์ ๋ํ์ฌ,
์ ์ $u$ ์์ $v$ ๋ก์ path๊ฐ ์์ผ๋ฉด,
$v$ ๋ $u$ ๋ก๋ถํฐ reachable(์ ๊ทผ ๊ฐ๋ฅํ)์ด๋ผ๊ณ ํฉ๋๋ค.
๐ง Reachability ์๊ณ ๋ฆฌ์ฆ
์ด๋ ํ ์ ์ $v$ ์์ reachableํ ๋ชจ๋ ์ ์ ๋ค์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํด๋น ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํจ์ ๋ค์๊ณผ ๊ฐ์ด ์ฆ๋ช ํ ์ ์์ต๋๋ค.
๐ ์ฆ๋ช
์ฆ๋ช ํ๊ณ ์ ํ๋ ์ ๋ฆฌ(Theorem)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
explore($G, \;v$)๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ค.
์ฆ๋ช ์ ๊ท๋ฅ๋ฒ(Proof by Contradiction)์ ํตํด ์งํ๋ฉ๋๋ค.
'explore($G, \; v$) ๊ฐ v์์ reachableํ ์ด๋ค ์ ์ $u$ ๋ฅผ ๋ฐฉ๋ฌธํ์ง ์๋๋ค'๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ $v$ ์ $u$ ์ฌ์ด์ Path์ ์กด์ฌํ๋ ์ ์ ๋ค ์ค ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์ ์ $z$ ๋ผ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ $z$ ์ดํ์ ๋ฐ๋ก ๋์ค๋ ์ ์ ์ $w$ ๋ผ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
(์ดํด๋ฅผ ๋๊ธฐ ์ํ ๊ทธ๋ฆผ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.)
์ด๋ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๋ฉด ๋ค์ ๋ถ๋ถ์ด ์์ต๋๋ค.
์ฆ ๋ ์ ์ฌ์ด๋ฅผ ์๋ ๊ฐ์ ์ด ์กด์ฌํ๋ฉด ๋ฐ๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.(์ด๋ ๊ฐ์ ์ด ์๋ '์ฌ์ค'์ ๋๋ค.)
๊ทธ๋ฌ๋ $(z, w) \in E$ ์์๋ ๋ถ๊ตฌํ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ผ๋ ์ด๋ $z$ ์ ์ธ์ (adjacent)ํ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๋ ์ฌ์ค์ ๋ชจ์๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
๐ฅ ์ฝ๋๋ก ๊ตฌํ
๋ค์ ๊ทธ๋ํ๋ฅผ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
/**
* Created by ShinD on 2022/09/22.
*/
fun main() {
val graph = GraphMaker().make()
GraphExplorer().explore(graph, graph.vertexSet.elementAt(0))
GraphMaker.vertexSet().forEach {
println("END [${it.value}], [ ${it.preOrder}, ${it.postOrder} ]")
}
}
class Graph(
val vertexSet: Set<Vertex>,
val graph: List<List<Vertex>>,
)
class GraphMaker {
companion object {
val a = Vertex('a')
val b = Vertex('b')
val c = Vertex('c')
val d = Vertex('d')
val e = Vertex('e')
val f = Vertex('f')
val g = Vertex('g')
val h = Vertex('h')
val i = Vertex('i')
val j = Vertex('j')
val k = Vertex('k')
val l = Vertex('l')
fun vertexSet(): Set<Vertex> {
return setOf(
a, b, c, d, e, f, g, h, i, j, k, l
)
}
}
fun make(): Graph {
return Graph(
vertexSet = vertexSet(),
graph = listOf(
listOf(b, c, d), // a
listOf(a, e, f), // b
listOf(a, f), // c
listOf(a, g, h), // d
listOf(b, i, j), // e
listOf(b, c), // f
listOf(d, h), // g
listOf(d, g), // h
listOf(e, j), // i
listOf(e, i), // j
listOf(l), // k
listOf(k), // l
)
)
}
}
class Vertex(
val value: Char,
var preOrder: Int = 0,
var postOrder: Int = 0,
var isVisited: Boolean = false,
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Vertex) return false
if (preOrder != other.preOrder) return false
if (postOrder != other.postOrder) return false
if (value != other.value) return false
return true
}
override fun hashCode(): Int {
var result = preOrder
result = 31 * result + postOrder
result = 31 * result + value.hashCode()
return result
}
}
class GraphExplorer {
// ์์ ์ 1๋ก ์ด๊ธฐํ
private var counter = 1
private fun visited(vertex: Vertex) {
vertex.isVisited = true
println("VISIT [${vertex.value}]")
}
private fun preVisit(vertex: Vertex) {
vertex.preOrder = counter
counter++
}
private fun postVisit(vertex: Vertex) {
vertex.postOrder = counter
counter++
}
fun explore(
graph: Graph,
root: Vertex,
) {
val idx = root.value - 'a'
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited(root);
// preVisit
preVisit(root);
// ๋ฃจํธ vertex์ adjacent ํ ๋ชจ๋ vertex ํ์
graph.graph[idx].forEach { vertex ->
/// ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด explore
if (!vertex.isVisited) explore(graph, vertex)
}
// postVisit
postVisit(root);
}
}
๐ง previsit, postvisit๋ ๋ญ์์??
์ํํ๋ ์์ ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
์ฐ์ ํด๋น procedure์ ๋ฑ์ฅํ๋ ์ ์ ๋ค์ ๋ชจ๋ preorder number์ postorder number ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํด๋น Procedure ์์ ์ , ์ด๋ ํ ์ ์(์ฌ๊ธฐ์๋ counter)๋ฅผ 1๋ก ์ด๊ธฐํ ํ ํ
previsit(v)๋ฅผ ํ ๋๋ง๋ค preorder number,
postvisit(v)๋ฅผ ํ ๋๋ง๋ค postorder number ์ ๊ฐ์ counter์ ๊ฐ์ผ๋ก ์ค์ ํ ํ, counter๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค.
๐ง ์ด๋ฐ ์ฐ๋๋ฐ์???
์ข ์ด๋ฐ ๋์ค๋๊น ๊ทธ๋ ์์๋ณด๊ณ , ์ง๊ธ์ ๋ค์ procedure๋ก ๋์๊ฐ ์๋ก์ด ๊ฐ๋ ๋ค์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ explore ์ฐ์ฐ์ ์ํ ๊ณผ์ ์ (ordered) tree๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ DFS tree๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
DFS tree์ root node๋ ์ฒ์ explore๋ฅผ ์์ํ๋ ์ ์ ์ด ๋ฉ๋๋ค.
explore ($G,$ $v$) ์ํ ๋์ค, explore($G,$ $u$)๋ฅผ ์ฌ๊ทํธ์ถํ ๊ฒฝ์ฐ, $u$ ์ ๋ถ๋ชจ ๋ ธ๋(parent node)๋ $v$ ๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํธ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง, ๊ธฐ์กด ๊ทธ๋ํ์ ํฌํจ๋ ๊ฐ์ ๋ค์ด ํฌํจ๋์ง ์์ ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด A์ C๋ฅผ ์ด์ด์ฃผ๋ ๊ฐ์ ์ฒ๋ผ ๋ง์ ๋๋ค.
๊ทธ๋ํ G์ ๊ฐ์ ๋ค ์ค DFS tree์ ์๋ ๊ฐ์ ์ tree edge๋ผ ํ๋ฉฐ,
DFS tree์ ์๋ ๊ฐ์ ์ back edge๋ผ๊ณ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก back edge๋ ์ ์ ์ผ๋ก ๋ํ๋ด๋ฉฐ, ์์ ์์์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
'๐ฅ Computer Science > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (3) - ์ฐ๊ฒฐ ์์(Connected Components)์ ๋จ์ ์ (Articulation Point) (0) | 2022.09.24 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (2) - DFS (0) | 2022.09.24 |
[์๊ณ ๋ฆฌ์ฆ] Selection ์๊ณ ๋ฆฌ์ฆ (0) | 2022.09.19 |
[์๊ณ ๋ฆฌ์ฆ] ๋ถํ ์ ๋ณต(Divide and Conquer)๊ณผ Master Theorem (0) | 2022.09.11 |
[์๊ณ ๋ฆฌ์ฆ] ๊ณฑํ๊ธฐ(Multiplication) ์๊ณ ๋ฆฌ์ฆ ($O(n^2)$) (0) | 2022.09.11 |