[k-mooc/자료구조] 11. 그래프

2025. 8. 11. 18:31·CS/자료구조

 

1. 그래프의 기본 개념

✅ 그래프
정점(Vertex)와 간선(Edge)의 집합 `G = (V, E)`
개체들 사이의 일대일 관계를 시각적으로 표현하는 수학적 모델

 

그래프를 표현하는 방법

[그래프의 시각적 표현] https://www.geeksforgeeks.org/dsa/introduction-to-graphs-data-structure-and-algorithm-tutorials/

수학적으로 표현하면:

V = {0, 1, 2, 3} //정점이 0,1,2,3이 있을 때
E = {(0,2), (0,3), (1,2), (1,3)} //각 정점이 가지고 있는 관계 (한 쌍 안의 두 정점은 이어져 있다)

 

📍 알고리즘 문제에서 사용하는 방식

 

엣지 리스트를 이용해 표현하면:

4,4 //Vertex의 개수, Edge의 개수 (Vertex: 0 - 3)
0,2 //Vertex 0과 2를 연결하는 Edge
0,3
1,2
1,3

 

방향과 가중치에 따른 그래프 종류

https://lms.kmooc.kr/course/view.php?id=9030

  • 무방향 그래프(Undirected, Non-weighted)
  • 방향 그래프(Directed, Non-weighted)
  • 가중치 그래프(Undirected, Weighted)
  • 방향 가중치 그래프(Directed, Weighted)

 

특별한 그래프

https://en.wikipedia.org/wiki/File:A_small_network_with_both_multiedges_and_self-edges.jpg

(1) Self edge를 가진 그래프

G = (V,E)
V = {1, 2, 3, 4, 5, 6}
E = {..., (2,2), ..., (6,6)}

2번 정점, 6번 정점은 자기 자신과 관계를 맺고 있다.

 

(2) Multi edge를 가진 그래프

G = (V,E)
V = {1, 2, 3, 4, 5, 6}
E = {..., (1,5), (1,5), (1,5), ..., (2,3), (2,3), ...}

1번 정점과 5번 정점, 2번 정점과 3번 정점이 여러개의 관계를 맺고 있다.

 

 

복잡도(Edge의 개수)에 따른 그래프 종류

https://lms.kmooc.kr/course/view.php?id=9030

 

(1) 완전 그래프: 모든 정점이 서로 연결된 그래프

정점 개수 n-1 모든 정점 n개 - 자기 자신
엣지 개수
(방향 그래프)
n(n-1) 모든 정점 n * 연결된 정점 개수 n-1
엣지 개수
(무방향 그래프)
n(n-1) / 2 무방향 그래프의 경우 관계가 중복되는 경우를 제거하기 위해 2로 나눠준다.

 

(2) 밀집 그래프: 정점 대부분이 서로 연결된 그래프

엣지 개수 O(n^2) 정점 하나에 k개 정점이 연결되어 있다고 하면, 엣지 개수는 n * k 개가 된다.
이 때 “대부분”이라고 했으므로 k는 n에 가까운 수이므로,
이를 o표기법으로 치환하면 O(n^2)로 표기할 수 있다.

 

(3) 희소 그래프: 모든 정점이 상수개(대략 k개)의 정점과 연결된 그래프

한 정점과 연결된
정점 개수
O(1) 상수 k개를 o표기법으로 치환하면 O(1)으로 표기할 수 있다.
엣지 개수 O(n) 모든 정점 개수를 곱하면 kn이 되는데, o표기법으로 치환하면 O(n)으로 표기할 수 있다.

 

 

2. 그래프의 용어

https://www.geeksforgeeks.org/dsa/applications-of-graph-data-structure/

 

Vertex(정점) 하나의 개체를 표현하며, 원 내부의 숫자나 문자로 나타낸다.
Edge(엣지) (1) 정점과 정점의 1:1 관계를 나타내며, 정점의 쌍으로 표현한다. `(0,1)`
(2) 방향성이 있는 관계의 경우 `(0,1) ≠ (1,0)`, 방향성이 없는 관계의 경우 `{0,1} = {1,0}`
인접(Adjacent) 정점 u와 v가 엣지로 연결되어 있을 경우, u와 v는 인접해 있다.
예: 정점 0과 1은 인접해있다.
Incident 두 엣지가 같은 정점을 공유하고 있을 경우, 두 엣지는 incident.
예: (0,1)과 (0,4)는 incident.
   
부분 그래프(Subgraph) G=(V,E)이고 G’=(V’,E’)일 때, V’가 V에 포함되고 E’가 E에 포함된다면, G’는 G의 부분 그래프이다.
   
경로(Path) 1. 정점 u에서 정점 v로 가는 경로는 다음을 만족하는 정점들의 연속체:
(1) (u, i), (i, j), …, Ik, v)는 E에 포함된다.
(2) 경로 (u, v) = (u, i, j, …, k, v
예: 경로 (0, 2): (0, 1, 2)

2. 물론 여러 개의 경로가 존재할 수 있다.
예: 경로 (0, 2): (0, 1, 2), (0, 1, 3, 2) …
경로의 길이
(length of path)
경로에 있는 정점 또는 엣지의 수
*가중치 그래프의 경우 경로에 있는 엣지의 가중치 합
최단 경로
(shortest path)
여러 경로 중에서 그 길이가 최소인 경로 또는 가중치의 합이 최소인 경우
단순 경로
(simple path)
시작 정점과 끝 정점을 제외한 모든 정점이 서로 다른 경로
   
순환(cycle) 첫 번째 정점과 마지막 정점이 일치하는 단순 경로
(어떤 정점에서 출발하여 다시 그 정점으로 돌아올 수 있는 단순 경로)
비순환 그래프
(acyclic graph)
순환이 존재하지 않는 그래프
   
연결(connected) 1. 두 정점 u와 v 사이에 경로가 존재할 경우, 이 두 정점은 연결되었다.
2. 어떤 그래프에 속한 모든 쌍의 정점이 연결되었을 경우, 이 그래프는 연결되었다.
연결 성분
(connected component)
연결된 부분 그래프의 최대치 (a maximal connected subgraph)
  *트리는 연결된 비순환 그래프(connected acyclic graph)라고 이야기할 수 있다.
방향 그래프에서의 연결 1. 방향 그래프에서는 경로에 방향성이 추가되므로 강한 연결(strongly connected)이라고 한다.
(서로 가는 길(엣지)가 존재해야만 연결되어있는 것으로, 그렇지 않으면 연결된 것이 아니다)

2. 강하게 연결된 부분 그래프의 최대치를 강한 연결 성분이라고 한다.
   
정점의 차수
(Degree of a vertex)
정점에 연결된 엣지의 수
   
신장 트리
(spanning tree)
모든 노드가 사이클 없이 연결된 부분 그래프

1. 그래프 G=(V,E)의 부분 그래프 T=(V’,E’)가 다음의 조건을 만족할 때 T는 G의 신장 트리:
(1) V’는 V와 같고 && E’는 E에 포함된다.
(2) E’는 순환이 없고 && E’의 수는 n-1개이다.

2. 여러 개의 신장 트리가 존재한다.

 

 

3. 그래프 구현

✅ 코딩에서 그래프를 구현하는 방법
그래프의 엣지 리스트를 제시한다.
정점은 `0 - (n-1)` 또는 `1 - n`으로 설정한다.

 

(1) 인접 행렬 (Adjacency matrix)

➡️ 정점의 개수가 n일 때, n x n 크기의 배열로 표현한다.
정점 i와 j가 연결되어 있다면 `a[i][j] = 1`
정점 i와 j가 연결되어 있지 않다면 `a[i][j] = 0`

https://www.geeksforgeeks.org/dsa/adjacency-matrix/

 🚧 이 때, 무방향 그래프의 행렬은 `a[i][j] == a[j][i]`를 만족하는 대칭 행렬이 된다.

 

(2) 인접 리스트 (Adjacency list)

➡️ n개의 연결 리스트로 표현한다: `adjLists[n]`
`adjLists[i]`는 정점 i로부터 시작하는 엣지에 연결된 정점을 연결하는 연결 리스트의 시작이다.

https://www.geeksforgeeks.org/c/c-program-to-implement-adjacency-list/

 

인접 리스트를 구현해보면:

//INPUT
4 5 //정점 개수:4, 엣지 개수:5

1 2
1 3
1 4
2 4
3 4
#include <vector>
#include <algorithm>

vector<int> edge[10001];

void main() {

	scanf("%d %d", &n &m);
	for(i=0; i<m; i++) {
		scanf("%d %d", &u &v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	
	/*
		만들어진 edge list
		1: 2, 3
		2: 1, 4
		3: 1, 4
		4: 1, 2
	*/
	
	//정렬되어 들어오지 않았을 경우를 대비해 정렬
	for(i=1; i<=n; i++) {
		sort(edge[i].begin(), edge[i].end());
	}
	
}

 

구현 방법 간 성능 비교

모든 정점에서 인접한 정점을 출력하시오
for all vertices v in G
	for all vertices w adjacent to v
		report (v, w);

 

이중 for문을 수행해야 한다.

  인접 행렬 인접 리스트
완전/밀집 그래프 O(n^2) O(n^2)
희소 그래프 O(n^2) O(n)

⇒ 최대한 인접 리스트를 사용하는 것이 좋다.

 

 

'CS > 자료구조' 카테고리의 다른 글

[k-mooc/자료구조] 13. 넓이 우선 탐색(BFS)  (2) 2025.08.17
[k-mooc/자료구조] 12. 깊이 우선 탐색(DFS)  (4) 2025.08.13
[k-mooc/자료구조] 10. 탐색  (6) 2025.08.09
[k-mooc/자료구조] 09. 우선 순위 큐(Priority Queue)와 힙(Heap)  (4) 2025.08.07
[k-mooc/자료구조] 08. 이진 탐색 트리(Binary Search Tree)  (1) 2025.08.06
'CS/자료구조' 카테고리의 다른 글
  • [k-mooc/자료구조] 13. 넓이 우선 탐색(BFS)
  • [k-mooc/자료구조] 12. 깊이 우선 탐색(DFS)
  • [k-mooc/자료구조] 10. 탐색
  • [k-mooc/자료구조] 09. 우선 순위 큐(Priority Queue)와 힙(Heap)
마동탁
마동탁
보고또보고
  • 마동탁
    원데이투데이
    마동탁
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • 개발 (2)
        • Elasticsearch (2)
      • CS (21) N
        • 자료구조 (15)
        • 네트워크 (6) N
      • 코딩테스트 (10)
        • 문제풀이 (8)
        • 알고리즘 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
마동탁
[k-mooc/자료구조] 11. 그래프
상단으로

티스토리툴바