콘텐츠로 바로가기

Graph Foundations & Flow

정점과 간선의 연결을 통해 현실 세계의 관계와 네트워크를 모델링하는 그래프 자료구조와, 최단 경로 및 네트워크 유량의 물리적 최적화를 다루는 학습 노드입니다.

Article
M

Me

hyunyoun's Blog

data-structures-algorithmsdata-structuresalgorithmsgraphstringoptimizationgraph-foundationsflow8 min read

1. Overview

그래프 기초와 흐름(Graph Foundations & Flow)은 도시 간 도로망부터 소셜 네트워크, 인터넷 라우팅, 회로 설계, 의존성 그래프까지 현실의 관계 구조를 정점(Vertex)과 간선(Edge)으로 추상화하여 탐색·최단경로·최대흐름·매칭을 수학으로 지배하는 알고리즘의 왕국입니다.

학습자는 그래프의 두 가지 표현(인접 행렬 vs 인접 리스트)의 메모리·시간 트레이드오프를 뜯어봅니다. BFS(너비 우선 탐색)와 DFS(깊이 우선 탐색)의 탐색 순서와 응용(위상 정렬, SCC)을 해부하고, 다익스트라(Dijkstra), 벨만-포드(Bellman-Ford), 플로이드-워셜(Floyd-Warshall) 세 가지 최단 경로 알고리즘의 가정(음수 간선 허용 여부, 단일·전쌍 최단 경로)을 비교합니다. 마지막으로 최대 흐름(Max-Flow, Ford-Fulkerson), 최소 컷-최대 흐름 정리(Max-Flow Min-Cut Theorem), **이분 매칭(Bipartite Matching)**을 해부하여 네트워크 용량 최적화 역량을 확보합니다.

2. Scope & Boundaries

In-Scope

  • 그래프 표현 (Graph Representation): 인접 행렬(Adjacency Matrix, O(V²)), 인접 리스트(Adjacency List, O(V+E)), 간선 리스트(Edge List).
  • 그래프 탐색 (Graph Traversal): BFS(Queue 기반, 최단 홉), DFS(Stack/재귀, 위상 정렬, SCC Kosaraju/Tarjan).
  • 최단 경로 (Shortest Path): Dijkstra(비음수 가중치, O((V+E)log V)), Bellman-Ford(음수 가중치, O(VE), 음수 사이클 탐지), Floyd-Warshall(전쌍, O(V³)).
  • 최대 흐름 (Max-Flow): Ford-Fulkerson(증가 경로), Edmonds-Karp(BFS 증가 경로, O(VE²)), 이분 매칭(Bipartite Matching).

Out-of-Scope

  • MST(최소 신장 트리): Kruskal/Prim → 04-03-03. Greedy Algorithms 영역.
  • NP-하드 그래프 문제: Hamilton Cycle, Graph Coloring 최적화 → 04-03-04. Backtracking / 04-04-04. Complexity 영역.

Boundaries

  • Dijkstra vs Bellman-Ford: Dijkstra는 음수 간선이 없는 그래프에서 O((V+E)log V)로 빠르지만, 음수 간선이 있으면 잘못된 답을 냅니다. Bellman-Ford는 음수 간선을 처리하고 음수 사이클을 탐지할 수 있지만 O(VE)로 느립니다. 간선 가중치가 모두 비음수이면 Dijkstra, 음수가 있으면 Bellman-Ford를 선택합니다.

3. Counterexample

  • 방향 그래프 위상 정렬에 사이클 존재 (Topological Sort with Cycle): 의존성 그래프에서 A → B → C → A 순환 의존(Circular Dependency)이 있는데 DFS 위상 정렬을 수행하는 실수. 사이클이 있는 방향 그래프(Directed Graph)는 위상 정렬이 불가능합니다. DFS 중 회색(현재 탐색 중) 노드를 재방문하면 사이클 존재를 탐지하고 예외를 던져야 합니다. npm/pip 패키지 의존성 설치 시 이 오류로 순환 의존성 에러가 발생합니다.
  • 음수 간선에서 다익스트라의 오답 (Dijkstra with Negative Edges): 그래프 A→B=5, A→C=1, C→B=-10에서 다익스트라로 A→B의 최단 거리를 구하는 경우. 다익스트라는 B=5를 확정(Finalize)한 뒤 나중에 A→C→B=-9를 발견해도 이미 확정된 B를 갱신하지 않습니다. 결과적으로 최단 거리 5(오답)를 반환합니다. 올바른 답은 -9이며 Bellman-Ford로만 구할 수 있습니다.

4. Prerequisites

  • 재귀와 큐/스택 (Basic): DFS(재귀/스택), BFS(큐) 기반이므로 해당 자료구조가 필요합니다. (04-01-03 Stacks & Queues)
  • 힙/우선순위 큐 (Recommended): Dijkstra의 핵심 자료구조. (04-02-02 Heaps)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Graph Representation & BFS/DFS 인접 행렬 vs 리스트의 트레이드오프와, BFS(최단 홉)/DFS(위상 정렬/SCC) 탐색 역학을 쥡니다. P1
2 Dijkstra & Bellman-Ford 비음수 그래프의 Dijkstra O((V+E)log V)와 음수 허용 Bellman-Ford O(VE)의 조건과 역학을 해부합니다. P5
3 Floyd-Warshall & DAG DP 전쌍 최단 경로 O(V³) DP와 DAG 최단·최장 경로, 위상 정렬 기반 DP를 뜯어봅니다. Industry
4 Max-Flow & Bipartite Matching 증가 경로로 네트워크 최대 흐름을 구하고, 최소 컷=최대 흐름 정리로 이분 매칭을 장악합니다. Industry

6. Learning Topics

Basic

Core Topic 01: 정점과 간선의 언어와 두 가지 탐색, 그래프 기초 (Graph Basics & BFS/DFS)

  • Why to Learn: SNS 친구 관계(무방향 그래프), 패키지 의존성(방향 그래프 DAG), 지하철 노선도(가중치 그래프) 등 모든 관계 구조를 그래프로 모델링하고, BFS/DFS로 탐색하는 만능 도구를 장착하기 위함입니다.
  • What to Learn:
    • Concepts: 방향/무방향/가중치 그래프, 인접 행렬(O(V²) 공간) vs 인접 리스트(O(V+E)), BFS(Queue, 최단 홉), DFS(Stack/재귀, 위상 정렬).
    • Skills: 위상 정렬(Kahn's BFS 방식 + DFS 방식), 사이클 탐지, SCC(강연결 요소).
    • Trade-offs: 인접 행렬은 O(1) 간선 존재 확인이 장점이지만 O(V²) 공간을 차지해 V=100만이면 10^12바이트(1TB)가 필요합니다. 인접 리스트는 O(V+E) 공간으로 희소 그래프에 적합하지만 특정 간선 존재 확인이 O(degree) 시간이 걸리는 트레이드오프.
  • How to Learn:
    • 1단계: BFS 미로 탐색. 시작 정점을 큐에 넣고, 레벨별로 인접 미방문 정점을 큐에 추가. 처음 목적지를 꺼내는 순간이 최단 경로(최소 홉)를 찾은 것임을 해부합니다.
    • 2단계: DFS 위상 정렬. DFS 완료(Post-order) 순서의 역순이 위상 정렬 순서임을 증명. 과목 의존성 그래프에서 수강 순서 도출을 뜯어봅니다.
  • Implement: 파이썬 Graph 클래스(인접 리스트). bfs(start, end) 최단 홉 경로 반환. topological_sort() DFS/Kahn's 두 방식. 과목 의존성 {'A':[], 'B':['A'], 'C':['A','B'], 'D':['C']} → 위상 정렬 ['A','B','C','D'] 검증.

Core Topic 02: 음수 없는 그래프의 왕과 음수 허용의 보험, 최단 경로 알고리즘 (Dijkstra & Bellman-Ford)

  • Why to Learn: 구글 지도 최단 경로(Dijkstra), 금융 차익 거래(Negative Cycle = Bellman-Ford), BGP 라우팅 프로토콜의 공통 핵심 알고리즘들을 조건에 따라 정확히 선택하는 역량을 갖추기 위함입니다.
  • What to Learn:
    • Concepts: Dijkstra(탐욕적 선택, 비음수 간선 조건), Bellman-Ford(완화(Relax) V-1회 반복, 음수 사이클 탐지), SPFA(Bellman-Ford 큐 최적화).
    • Skills: Dijkstra Lazy Deletion, Bellman-Ford 음수 사이클 판별(V번째 완화 성공 시).
  • How to Learn:
    • 1단계: Dijkstra의 완화(Relax) 단계: if dist[u] + w(u,v) < dist[v]: dist[v] = dist[u] + w(u,v). Min-Heap에서 최소 거리 정점을 꺼내 모든 인접 정점 완화. 방문 확정된 정점은 재방문 불필요(비음수 보장 덕분)를 해부합니다.
    • 2단계: Bellman-Ford: 모든 간선에 대해 완화를 V-1번 반복. V번째에도 완화가 성공하면 음수 사이클 존재. 금융 차익 거래 탐지(통화 환율 그래프에서 음수 사이클)에 적용하는 역학을 뜯어봅니다.
  • Implement: dijkstra(graph, start) + bellman_ford(edges, V, start). 동일 그래프에 두 알고리즘 적용하여 동일 결과 assert. 음수 간선 추가 시 Dijkstra 오답, Bellman-Ford 정답 비교 데모. 음수 사이클 그래프에서 Bellman-Ford 탐지 로그.

Practical

Core Topic 03: 모든 쌍의 거리와 DAG 최적 경로, Floyd-Warshall과 DAG DP (Floyd-Warshall & DAG)

  • Why to Learn: V개의 모든 정점 쌍 최단 경로(All-Pairs Shortest Path)를 O(V³) 단 3중 루프로 해결하는 Floyd-Warshall의 우아한 DP와, 프로젝트 일정 최장 경로(Critical Path Method)를 DAG DP로 구하는 역량을 장악하기 위함입니다.
  • What to Learn:
    • Concepts: Floyd-Warshall dp[k][i][j] = min(dp[k-1][i][j], dp[k-1][i][k]+dp[k-1][k][j]), 거리 행렬 초기화, 음수 사이클 탐지(dp[i][i]<0).
    • Skills: DAG 최장 경로(프로젝트 임계 경로 CPM), 위상 정렬 순으로 완화.
  • How to Learn:
    • 1단계: Floyd-Warshall: "정점 k를 경유해도 되는가?"를 k=0부터 V-1까지 순차 허용하며 dist[i][j]를 업데이트. k번째 반복 후 dist[i][j]는 "0~k번 정점만 경유 가능할 때 i→j 최단 거리"를 뜯어봅니다.
    • 2단계: DAG 최장 경로(Critical Path): 위상 정렬 순으로 정점을 처리하며 longest[v] = max(longest[u] + w(u,v)) 완화. 소프트웨어 개발 작업 의존성에서 임계 경로(병목 작업 체인) 탐색을 해부합니다.
  • Implement: floyd_warshall(adj_matrix). 5개 정점 그래프에서 전쌍 거리 행렬 출력. 대각선 음수 값으로 음수 사이클 탐지 검증. dag_longest_path(graph, source) 구현으로 CPM 예시(작업 7개, 의존성 12개) 임계 경로 출력.

Advanced

Core Topic 04: 파이프의 최대 물 흐름과 최소 컷, 최대 흐름 (Max-Flow & Min-Cut)

  • Why to Learn: 데이터센터 네트워크 최대 대역폭, 이미지 세그멘테이션, 인력 배치(이분 매칭)의 공통 수학 엔진인 Max-Flow와, 최소 비용으로 네트워크를 단절하는 Min-Cut의 동치 관계를 장악하기 위해서입니다.
  • What to Learn:
    • Concepts: 소스(Source)/싱크(Sink), 용량(Capacity)/흐름(Flow), 잔여 그래프(Residual Graph), 증가 경로(Augmenting Path), Max-Flow Min-Cut Theorem.
    • Skills: Edmonds-Karp(BFS로 증가 경로, O(VE²)), 이분 매칭(Bipartite Matching = Max-Flow 특수 케이스).
  • How to Learn:
    • 1단계: Ford-Fulkerson: 소스에서 싱크로의 경로를 찾아 최소 용량(Bottleneck) 만큼 흐름 증가. 잔여 그래프에 역방향 간선 추가. 더 이상 증가 경로가 없을 때까지 반복. 총 흐름 = 최대 흐름을 해부합니다.
    • 2단계: 이분 매칭: 왼쪽 그룹(지원자)과 오른쪽 그룹(직무) 사이 간선을 가진 이분 그래프(Bipartite Graph). 소스→모든 왼쪽(용량1), 모든 오른쪽→싱크(용량1), 이분 간선(용량1)으로 구성. Max-Flow = 최대 매칭 수를 뜯어봅니다.
  • Implement: max_flow_edmonds_karp(graph, source, sink). BFS로 증가 경로 탐색, 잔여 그래프 업데이트. 5×5 이분 그래프 매칭(지원자 5명, 직무 5명)에 Max-Flow 적용하여 최대 매칭 수와 실제 매칭 쌍 출력. Min-Cut을 최대 흐름 계산 후 BFS로 도달 가능 정점 집합으로 구하는 구현.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
Graph 정점과 그들을 잇는 간선들의 집합으로 현실의 관계를 추상화한 자료구조입니다. 기본 관계 기초 Node / Edge Tree 반드시 모든 노드가 연결되진 않음 P1:CS2023 core
Adjacency List 각 정점에서 연결된 다른 정점들의 주소를 리스트로 관리하는 메모리 효율적 방식입니다. 기본 물리 표현 Memory / Pointer Matrix 데이터 검색 속도가 행렬보다 느림 P1:CS2023 core
Relaxation (완화) 새로운 경로를 발견했을 때 기존의 최단 거리 정보를 더 작은 값으로 갱신하는 수리 연산입니다. 추천 경로 갱신 Update / Path Smoothing 단순히 '값을 바꿈' 이상의 의미 P1:CS2023 core
Maximum Flow 네트워크의 모든 간선 용량 제약을 만족하며 소스에서 싱크로 보낼 수 있는 최대 물리 유량입니다. 심화 용량 최적화 Capacity / Sink Cut '최단 경로'와는 상충하는 개념 Industry core

8. References

Primary

Secondary

  • [Introduction to Algorithms (CLRS)] Cormen — Comprehensive graph and flow analysis.
  • [Algorithms in C++, Part 5: Graph Algorithms] Sedgewick — Practical graph implementation.

Industry

  • [Neo4j: Graph Data Modeling Standards] — Real-world graph database application.
  • [Google: Pregel - A System for Large-Scale Graph Processing] — Distributed graph industry case.

9. Final Checklist

Primary

  • '인접 행렬'과 '인접 리스트' 중 간선이 매우 적은 '희소 그래프'에 어느 것이 물리적으로 유리한지 설명 가능한가? (P1)
  • 'BFS'가 가중치가 없는 그래프에서 왜 항상 '최단 경로'를 보장하는지 수리적으로 입증할 수 있는 가? (P1)

Secondary

  • 다익스트라 알고리즘이 '음수 가중치'를 만났을 때, 왜 가중치를 더할수록 거리가 짧아지는 물리적 모순에 빠지는지 소통 가능한가?
  • 그래프의 '최대 유량(Max Flow)'과 '최소 컷(Min Cut)'이 왜 수리적으로 동일한 물리적 의미를 갖는지 도출할 수 있는 가?

Industry

  • 대규모 마이크로서비스 아키텍처(MSA)에서 서비스 간의 의존성을 그래프로 모델링하고, '순환 의존성'을 감지하는 방안을 제안할 수 있는 가? (SFIA)
  • 클라우드 오케스트레이션 설계 시, 리소스 할당 최적화를 위해 '이분 매칭(Bipartite Matching)'을 유량 문제로 설계하는 방안을 기술할 수 있는 가?

Advanced Data Structures & Algorithms

1 / 4