정점
(vertex, node)와 간선
(edge)으로 이루어진 자료구조로써 간선으로 연결된 정점들이 하나의 그래프를 구성한다.
코딩테스트에서는 주어진 그래프를 해당 언어의 자료구조로 구현하고 이를 활용하여 경로 비용, 조건 부합성 등을 계산하는 방향으로 제시된다.
➕ 컴퓨터공학에서 그래프는 알고리즘 그래프 이론에서 활용하며 유한 그래프의 구조를 계산하는 알고리즘과 알고리즘의 계산 복잡도를 연구한다. 일부 문제가 NP-완전 문제이다.
방향/무방향 그래프
간선의 방향 유무로 구분
가중치 그래프
간선에 가중치/비용 부여
순환/비순환 그래프
회로(cycle)의 유무로 구분
회로(cycle)
= 간선을 한 번만 지나갈 수 있을 때, 한 정점에서 출발하여 다시 해당 정점으로 갈 수 있는 경로
🌲 트리
비순환 그래프의 일종으로 부모→자식 단방향 그래프
연결/비연결 그래프
그래프를 이루는 정점 중 두개를 선택하는 모든 경우에 대한 경로 존재 여부
정규 그래프, 완벽 그래프 등 몇가지 더 있지만 코딩테스트에서 잘 쓰이지 않는다.
Linked List / vector 배열 (ctor<int> adj[]
) / 딕셔너리 등
⇒ 간선이 있는 경우만 저장하기 때문에
➕ 간선 리스트 - 각 정점에 연결된 간선을 [출발 노드, 도착 노드, 가중치] 형태로 저장
그래프의 모든 정점들을 방문하는 것
각 정점들을 한 번 이상 방문하는 경우,
다른 모든 정점들을 연결시켜주는 정점이 존재하지 않는 경우 모두 가능하다.
루트 탐색 순서를 기준으로 전위(preorder), 중위(inorder), 후위(postorder) 탐색 방법과
흔히 BFS로 불리는 정점의 레벨 순서로 탐색하는 레벨 오더(level order) 탐색 방법이 존재한다.
아래 알고리즘은 하나하나 따로 톺아보는 것이 필요하다.
그래프 탐색 - DFS/BFS
최단 경로 | 최소 비용 - 다익스트라 (Dijkstra), 벨만-포드 (Bellman-Ford), 플로이드 (Floyd)
최소 신장 트리 - 크루스칼 (Kruskal), 프림(Prim)
선후 관계 - 위상 정렬
https://ko.wikipedia.org/wiki/그래프_이론
https://yozm.wishket.com/magazine/detail/2411/
https://velog.io/@boyeon_jeong/그래프-종류-및-개념
https://velog.io/@eunchae2000/자료구조-그래프를-저장하는-방법-3가지-인접-행렬-인접-리스트-간선-리스트-with-Python#3️⃣-간선-리스트-edge-list
https://ko.wikipedia.org/wiki/트리_순회