예를 들어:
A --- B
이건 A에서 B로 갈 수 있고, B에서도 A로 갈 수 있어. 하나의 간선으로 양방향 이동이 가능하다는 거야.
예를 들어:
A → B
B → A
이건 방향 그래프 안에서 양방향 연결이 존재하는 상황이야.
| 구분 | 무방향 그래프 | 양방향 그래프 (in 방향 그래프) |
|---|---|---|
| 간선의 개수 | A-B 간선 하나 | A→B, B→A 간선 두 개 필요 |
| 메모리 사용 | 간선 1개 | 간선 2개 |
| 코드 표현 방식 | 리스트 한 쌍에 A-B 추가 | A의 리스트에 B 추가, B의 리스트에 A 추가 |
| 사용되는 곳 | 친구 관계, 도로 연결 (이동 가능) | 네트워크 프로토콜, 메시지 왕복 등 |
무방향 그래프:
A --- B
양방향 그래프 (방향 그래프 상의 양방향 연결):
A → B
B → A
아래는 무방향, 방향, 가중치 그래프의 예시와 각각을 표현하는 방식(인접 행렬과 인접 리스트)을 시각적으로 나타낸 그림이야:

이 그림을 참고하면, 그래프의 구조와 표현 방식이 문제에 따라 어떻게 선택되어야 하는지를 더 쉽게 이해할 수 있어.
그래프는 기본적으로 "점과 선"으로 구성돼 있어. 각각의 용어를 명확히 이해하고 있어야 그래프 알고리즘을 쉽게 다룰 수 있어.
A → B처럼 방향성이 있는 연결을 뜻함.| 용어 | 의미 요약 | 예시 |
|---|---|---|
| Vertex | 데이터가 담긴 점 | 도시 A, 사용자 B 등 |
| Node | Vertex와 같은 의미 | 정점 1, 정점 2 |
| Edge | 두 정점을 연결하는 선 | A — B, 또는 A → B |
| Arc | 방향이 있는 간선 | A → B |
이 용어들을 정확히 이해하면, 그래프 문제의 조건이나 표현을 해석할 때 훨씬 빠르게 구조를 파악할 수 있어.
list of lists) 또는 딕셔너리의 리스트(defaultdict(list)) 형태로 구현graph = [
[], # 0번 노드 (사용 안함)
[2, 5], # 1번 노드는 2번, 5번과 연결
[1], # 2번 노드는 1번과 연결
[4], # 3번 노드는 4번과 연결
[3, 6], # 4번 노드는 3번, 6번과 연결
[1], # 5번 노드는 1번과 연결
[4] # 6번 노드는 4번과 연결
]
O(degree of node)matrix[i][j] = 1이면 i와 j가 연결됨, 아니면 0graph = [
[0, 0, 0, 0, 0, 0, 0], # 0번 노드 (사용 안함)
[0, 0, 1, 0, 0, 1, 0], # 1번 노드는 2, 5와 연결
[0, 1, 0, 0, 0, 1, 0], # 2번 노드는 1, 5와 연결
[0, 0, 0, 0, 1, 0, 0], # 3번 노드는 4와 연결
[0, 0, 0, 1, 0, 0, 1], # 4번 노드는 3, 6과 연결
[0, 1, 1, 0, 0, 0, 0], # 5번 노드는 1, 2와 연결
[0, 0, 0, 0, 1, 0, 0] # 6번 노드는 4와 연결
]
O(N^2) | 항목 | 인접 리스트 | 인접 행렬 |
|---|---|---|
| 연결 여부 확인 | 느림 (O(degree)) | 빠름 (O(1)) |
| 간선 순회 | 빠름 (O(간선 수)) | 느림 (O(N^2)) |
| 공간 효율 | 높음 (O(N + E)) | 낮음 (O(N^2)) |
| 그래프 밀도 | 희소 그래프에 적합 | 조밀 그래프에 적합 |
| 구현 난이도 | 약간 복잡 | 간단 |
※ 참고: 그래프 밀도란 간선의 수가 노드 수에 비해 얼마나 많은지를 의미한다.