Post

🐒 6. Graphs

🫧 κ·Έλž˜ν”„

  • 정점(V, vertex)κ³Ό 정점듀을 μ—°κ²°ν•˜λŠ”Β κ°„μ„ (E, edge) 으둜 이루어진 μžλ£Œκ΅¬μ‘°μ΄λ‹€.
  • μ—°κ²°λ˜μ–΄ μžˆλŠ” κ°μ²΄κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.
  • κ·Έλž˜ν”„λŠ” μ—¬λŸ¬κ°œμ˜ 고립된 λΆ€λΆ„ κ·Έλž˜ν”„λ‘œ ꡬ성될 수 μžˆλ‹€.
  • κ·Έλž˜ν”„λŠ”Β G = (V,E) 둜 ν‘œν˜„ν•œλ‹€.(VλŠ” κ·Έλž˜ν”„μ—μ„œΒ μ •μ μ˜ 집합을 λ‚˜νƒ€λ‚΄κ³ Β EλŠ”Β κ°„μ„ μ˜ 집합을 λ§ν•œλ‹€.)
  • κ·Έλž˜ν”„λŠ” λ„€νŠΈμ›Œν¬ λͺ¨λΈμ΄λ‹€.
  • 2개 μ΄μƒμ˜ κ²½λ‘œκ°€ κ°€λŠ₯ν•˜λ‹€.
    • 즉, 정점(λ…Έλ“œ)λ“€ 사이에 무방ν–₯/λ°©ν–₯μ—μ„œ μ–‘λ°©ν–₯ 경둜λ₯Ό κ°€μ§ˆμˆ˜κ°€ μžˆλ‹€.
  • self-loop뿐만 μ•„λ‹ˆλΌ loop/circuit λͺ¨λ‘ κ°€λŠ₯ν•˜λ‹€.
  • 루트 λ…Έλ“œλΌλŠ” κ°œλ…μ΄ μ—†λ‹€.
  • λΆ€λͺ¨-μžμ‹κ΄€κ³„λΌλŠ” κ°œλ…μ΄ μ—†λ‹€.
  • κ·Έλž˜ν”„λŠ” 크게 λ°©ν–₯ κ·Έλž˜ν”„μ™€ 무방ν–₯ κ·Έλž˜ν”„κ°€ μžˆλ‹€.
  • κ°„μ„ μ˜ μœ λ¬΄λŠ” κ·Έλž˜ν”„μ— 따라 λ‹€λ₯΄λ‹€.
  • κ·Έλž˜ν”„λŠ” μˆœν™˜ ν˜Ήμ€ λΉ„μˆœν™˜μ΄λ‹€.

❀️ 1. 무방ν–₯ κ·Έλž˜ν”„

무방ν–₯ κ·Έλž˜ν”„λŠ”Β λ‘ 정점을 μ—°κ²°ν•˜λŠ” 간선에 λ°©ν–₯이 μ—†λŠ” κ·Έλž˜ν”„Β μ΄λ©°, μ–‘ λ°©ν–₯으둜 이동이 κ°€λŠ₯ν•˜λ‹€.

μ•„λž˜ κ·Έλ¦Όκ³Ό 같은 무방ν–₯ κ·Έλž˜ν”„μ—μ„œ 정점 A와 Bλ₯Ό λ‚˜νƒ€λ‚Ό λ•ŒΒ (A,B)Β λ˜λŠ”Β (B,A) 둜 ν‘œν˜„ν•œλ‹€. 두 ν‘œν˜„μ€ λ™μΌν•œ μ˜λ―Έμ΄λ‹€.

22.png

❀️ 2. λ°©ν–₯ κ·Έλž˜ν”„

두 정점을 μ—°κ²°ν•˜λŠ” 간선에 λ°©ν–₯이 μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„μ΄λ©°, κ°„μ„ μ˜ λ°©ν–₯으둜만 이동할 수 μžˆλ‹€.

μ•„λž˜ 그림같은 경우 A -> CΒ λ°©ν–₯으둜만 이동이 κ°€λŠ₯ν•˜λ‹€. 이런 κ·Έλž˜ν”„λŠ”Β <A,C> 둜 ν‘œν˜„ν•˜λŠ”λ°Β <C,A> 둜 ν‘œν˜„ν•˜λ©΄Β C -> AΒ λ°©ν–₯으둜만 이동가λŠ₯ν•˜λ‹€λŠ” κ²ƒμœΌλ‘œ μ˜λ―Έκ°€ 달라진닀.

23.png

🫧 인접 리슀트

κ·Έλž˜ν”„μ˜ λ…Έλ“œλ“€μ„ 리슀트둜 ν‘œν˜„ν•œκ²ƒμ΄λ‹€.

주둜 μ •μ μ˜ 리슀트 배열을 λ§Œλ“€μ–΄ 관계λ₯Ό μ„€μ •ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.

  • λͺ¨λ“  정점을 μΈμ ‘λ¦¬μŠ€νŠΈμ— μ €μž₯ν•˜κ³  각 정점(λ…Έλ“œ)에 μΈμ ‘ν•œ 정점듀을 리슀트둜 λ§Œλ“œλŠ” 방법이닀.
  • 곡간은 κ°„μ„ μ˜ 개수만큼 ν•„μš”ν•˜λ‹€.
    • 정점과 μ—°κ²°λœ κ°„μ„ μ˜ 개수만큼 λ¦¬μŠ€νŠΈμš”μ†Œλ“€μ΄ μ €μž₯되기 λ•Œλ¬Έμ΄λ‹€. μœ„ κ·Έλ¦Όμ—μ„œ μ‚΄νŽ΄λ³΄λ©΄ 정점1κ³Ό 정점 2와 5λ₯Ό μ—°κ²°ν•˜λŠ” κ°„μ„ μ˜ 개수만큼 μš”μ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλŠ”κ±Έ 확인할 수 μžˆλ‹€.

🫧 인접 ν–‰λ ¬

N x N ν–‰λ ¬λ‘œμ¨ matrix[i][j] = 1이면 정점 iμ—μ„œ j둜 κ°€λŠ” 간선이 μ‘΄μž¬ν•˜κ³  matrix[i][j] = 0이면 정점 iμ—μ„œ j둜 κ°€λŠ” 간선이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

단, κ°€μ€‘μΉ˜ κ·Έλž˜ν”„μ˜ 경우 matrix[i][j] > 0이면 iμ—μ„œ j둜 κ°€λŠ” 간선이 μ‘΄μž¬ν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€.

  • 인접 행렬은 booleanΒ νƒ€μž…μ˜ ν–‰λ ¬ λ˜λŠ”Β 0κ³ΌΒ 1둜 κ΅¬μ„±λœ μ •μˆ˜ νƒ€μž…μ˜ 행렬을 μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ •μ μ˜ κ°œμˆ˜κ°€Β N인 κ·Έλž˜ν”„λ₯Ό μΈμ ‘ν–‰λ ¬λ‘œ ν‘œν˜„μ‹œ κ°„μ„ μ˜ μˆ˜μ™€ λ¬΄κ΄€ν•˜κ²ŒΒ n^2개의 λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ‹€.
  • 무방ν–₯ κ·Έλž˜ν”„λ₯Ό μΈμ ‘ν–‰λ ¬λ‘œ ν‘œν˜„ν•œλ‹€λ©΄ 이 행렬은 λŒ€μΉ­ 행렬이 λœλ‹€. λ¬Όλ‘  λ°©ν–₯κ·Έλž˜ν”„λŠ” λŒ€μΉ­ν–‰λ ¬μ΄ λ˜μ§€ μ•Šμ„μˆ˜λ„ μžˆλ‹€.
  • μΈμ ‘λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•œ κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜(Ex. λ„ˆλΉ„ μš°μ„  탐색) λ˜ν•œ μΈμ ‘ν–‰λ ¬μ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ, 인접행렬은 νš¨μœ¨μ„±μ΄ 떨어진닀.
    • 인접 λ¦¬μŠ€νŠΈλŠ” μ–΄λ–€ λ…Έλ“œμ— μΈμ ‘ν•œ λ…Έλ“œλ“€μ„ μ‰½κ²Œ 찾을 수 μžˆμ§€λ§Œ 인접 ν–‰λ ¬μ—μ„œλŠ” μΈμ ‘ν•œ λ…Έλ“œλ₯Ό μ°ΎκΈ° μœ„ν•΄ λͺ¨λ“  λ…Έλ“œλ₯Ό μ „λΆ€ μˆœνšŒν•΄μ•Ό ν•œλ‹€

🫧 κ·Έλž˜ν”„ 탐색

❀️ 1. 깊이 μš°μ„  탐색(DFS, Depth-First Search)

루트 λ…Έλ“œ(ν˜Ήμ€ λ‹€λ₯Έ μž„μ˜μ˜ λ…Έλ“œ)μ—μ„œ μ‹œμž‘ν•΄ λ‹€μŒ λΆ„κΈ°λ‘œ λ„˜μ–΄κ°€κΈ°μ „μ— ν•΄λ‹Ή λΆ„κΈ°λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” 방법이닀.

  • λ„“κ²Œ νƒμƒ‰ν•˜κΈ° 전에 깊게 νƒμƒ‰ν•˜λŠ” 방법이닀.
  • λͺ¨λ“  λ…Έλ“œλ“€μ„ νƒμƒ‰ν•΄μ•Όν•˜λŠ” κ²½μš°μ— 이 방법을 μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€.
    • λ„ˆλΉ„ μš°μ„  탐색에 λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ κ°„λ‹¨ν•˜λ‹€.

❀️ 2. λ°©ν–₯ κ·Έλž˜ν”„

루트 λ…Έλ“œ(ν˜Ήμ€ λ‹€λ₯Έ μž„μ˜μ˜ λ…Έλ“œ)μ—μ„œ μ‹œμž‘ν•΄ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방법

  • 깊게 νƒμƒ‰ν•˜κΈ° 전에 λ„“κ²Œ νƒμƒ‰ν•˜λŠ” 탐색방법
  • 두 λ…Έλ“œμ‚¬μ΄μ˜ μ΅œλ‹¨κ²½λ‘œ ν˜Ήμ€ μž„μ˜μ˜ 경둜λ₯Ό μ°Ύκ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•œλ‹€
This post is licensed under CC BY 4.0 by the author.