10 장 . 그래프 (graph) 1 절 . 그래프 2 절 . 그래프 표현 3 절 . 그래프 탐색 4...
DESCRIPTION
10 장 . 그래프 (Graph) 1 절 . 그래프 2 절 . 그래프 표현 3 절 . 그래프 탐색 4 절 . 신장트리 및 최소비용 신장트리. 이 완 직 ( [email protected] ) 2010 년 1 학기. 1. 그래프. 선형 자료구조나 트리 자료구조로 표현하기 어려운“多 : 多”의 관계를 가지는 원소들을 표현하기 위한 자료구조 정점 (vertex) 과 간선 (edge) 들의 집합. 1.1 그래프 종류. 무방향 그래프 - PowerPoint PPT PresentationTRANSCRIPT
이 완 직 ([email protected])2010 년 1 학기
10 장 . 그래프 (Graph)1 절 . 그래프2 절 . 그래프 표현3 절 . 그래프 탐색4 절 . 신장트리 및 최소비용 신장트리
• 선형 자료구조나 트리 자료구조로 표현하기 어려운“多 :多”의 관계를 가지는 원소들을 표현하기 위한 자료구조– 정점 (vertex) 과 간선 (edge) 들의 집합
1. 그래프
2
• 무방향 그래프– 두 정점을 연결하는 간선의 방향이 없는 그래프로서 양방향으로
갈 수 있다 .
1.1 그래프 종류
3
V(G1) ={A, B, C, D} E(G1)={(A, B), (A, C), (A, D), (B, C), (C, D)}V(G2) ={A, B, C, D} E(G2) ={(A, B), (A, C)}
• 방향 그래프– 간선이 방향을 가지고 있는 그래프로서 도로의 일방통행 길처럼
간선을 통하여 한쪽 방향으로만 갈수 있다 .
1.1 그래프 종류
4
V(G3)={A, B, C, D} E(G3)={<A, B>, <A, D>, <D, B>, <C, D>} V(G4)={A, B, C, D} E(G4)={<A, B>, <A, C>}
• 완전 그래프 – 각 정점에서 다른 모든 정점을 연결하여 가능한의 최대 간선수를
가진 그래프이다 .
1.1 그래프 종류
5
• 부분 그래프– 원래의 그래프에서 일부의 정점이나 간선을 제외하여 만든
그래프– 그래프 G 와 부분 그래프 G' 는 다음과 같은 관계를 갖는다 .
1.1 그래프 종류
6
V(G')⊆V(G), E(G')⊆E(G)
• 가중치 그래프 (weighted graph) 또는 네트워크(network) 간선에 비용이나 가중치가 할당된 그래프
1.1 그래프 종류
7
• 인접 정점 (adjacent vertex)– 간선에 의해 연결된 정점을 의미한다 .
• 차수 (degree)– 정점에 부속되어 있는 간선의 수를 말한다 .
• 방향 그래프의 진입차수 (in-degree)– 정점을 머리로 하는 간선의 수로서 외부에서 오는 간선의 수
• 방향 그래프의 진출차수 (out-degree)– 정점을 꼬리로 하는 간선의 수의 수로서 외부로 향하는 간선의 수
• 경로 (path) – 그래프에서 간선을 따라 갈 수 있는 길을 순서대로 나열한 것 .
1.2 그래프 관련 용어
8
• 경로길이 (path length)– 경로를 구성하는 간선의 수
• 사이클 (cycle)– 단순경로 중에서 경로의 시작 정점과 마지막 정점이 같은 경로
• 그래프와 트리의 차이점– 트리는 사이클을 허용하지 않는다 .
1.2 그래프 관련 용어
9
• 그래프를 표현– 정점에 대한 집합과 정점에 부속된 간선이 집합을 표현
• 그래프를 구현하기 위해서 필요한 연산
2. 그래프의 표현
10
• 행렬에 대한 2 차원 배열을 사용하는 순차 자료구조 방법으로서 그래프를 메모리에 표현한 것
2.1 인접 행렬 (adjacent matrix)
11
• [ 예제 10-1] 인접 행렬
12
• 각 정점에 대한 인접 정점들을 단순 연결 리스트로 표현한 것
2.2 인접 리스트 (adjacent list)
13
14
• [ 예제 10-2] 인접 리스트
15
• [ 예제 10-2] 수행 결과
• 그래프의 가장 기본적인 연산으로 , 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것
• 그래프 탐색의 2 가지 방법– 깊이 우선 탐색 (DFS: depth-first search)– 너비우선 탐색 (BFS: breadth-first search)
3. 그래프 탐색
16
• 한 방향으로 갈 수 있을 만큼 계속 가다가 더 이상 갈 수 없게 되면 ,가장 마지막에 만났던 갈림길 간선이 있는 정점으로 되돌아온 후 , 이곳으로부터 다른 방향의 간선으로 탐색을 계속 반복하여 결국 모든 정점을 방문하는 방법이다 .
① 그래프의 시작 정점 v 를 결정하여 방문하고 방문하였다는 표시를 한다 .
② 정점 v 에 인접한 정점 중에서 아직 방문하지 않은 정점 w 가 있으면 정점 v 를 스택에 push 하고 w 를 방문한다 . 그리고 w 를 v 로 하여 다시 를 반복한다 . 방문하지 않은 정점이 없으면 ,탐색의 방향을 바꾸기 위해 스택을 pop 하여 받은 가장 마지막 방문 정점을 v 로 하여 다시 를 수행한다 .
③ 스택이 공백이 될 때까지 를 반복한다 .
3.1 깊이우선 탐색 (DFS)
17
• 그래프 G 에 대한 깊이우선 탐색 알고리즘
• 초기상태– 배열 visited 를 false 로 초기화하고 공백 스택을 생성
3.1 깊이우선 탐색 (DFS)
18
① 정점 A 를 시작으로 깊이우선 탐색을 시작한다 .
visited[A] ← true;A 방문 ;
3.1 깊이우선 탐색 (DFS)
19
② 정점 A 에 방문하지 않은 정점 B, E 가 있으므로 A 를 스택에 push 하고 인접정점 B 와 E 중 , 오름차순에 따라 B 를 선택하여 탐색을 계속
push(stack, A);visited[B] ← true;B 방문 ;
20
③ 정점 B 에 방문하지 않은 정점 C, D 가 있으므로 B 를 스택에 push 하고 인접정점 C 와 D 중에서 오름차순에 따라 C 를 선택하여 탐색을 계속
push(stack, B);visited[C] ← true;C 방문
21
④ 정점 C 에 방문하지 않은 정점 D, E 가 있으므로 C 를 스택에 push 하고 인접정점 D 와 E 중 오름차순에 따라 D 를 선택하여 탐색을 계속
push(stack, C);visited[D] ← true;D 방문 ;
22
⑤ 정점 D 에서 방문하지 않은 인접정점이 없으므로 , 마지막 정점으로 돌아가기 위해서 스택을 pop 하여 받은 정점 C 에 대하여 방문하지 않은 인접정점이 있는지 확인한다 .
pop(stack);
23
⑥ 정점 C 에 방문하지 않은 정점 E 가 있으므로 C 를 스택에 push하고 인접정점 E 를 선택하여 탐색을 계속한다 .
push(stack, C);visited[E] ← true;E 방문 ;
24
⑦ 정점 E 에 방문하지 않은 정점 F 가 있으므로 E 를 스택에 push하고 인접정점 F 를 선택하여 탐색을 계속한다 .
push(stack, E);visited[F] ← true;F 방문 ;
25
⑧ 정점 F 에서 방문하지 않은 인접정점이 없으므로 , 마지막 정점으로 돌아가기 위해서 스택을 pop 하여 받은 정점 E 에 대하여 방문하지 않은 인접정점이 있는지 확인한다 .
pop(stack);
26
⑨ 정점 E 에서 방문하지 않은 인접정점이 없으므로 , 마지막 정점으로 돌아가기 위해서 스택을 pop 하여 받은 정점 C 에 대하여 방문하지 않은 인접정점이 있는지 확인한다 .
pop(stack);
27
⑩ 정점 C 에서 방문하지 않은 인접정점이 없으므로 , 마지막 정점으로 돌아가기 위해서 스택을 pop 하여 받은 정점 B 에 대하여 방문하지 않은 인접정점이 있는지 확인한다 .
pop(stack);
28
⑪ 정점 B 에서 방문하지 않은 인접정점이 없으므로 , 마지막 정점으로 돌아가기 위해서 스택을 pop 하여 받은 정점 A 에 대하여 방문하지 않은 인접정점이 있는지 확인한다 .
pop(stack);
29
⑫ A 에 방문하지 않은 인접 정점이 없고 , 스택도 공백이므로 종료
• 스택 탐색한 경로 순서는 A-B-C-D-E-F 이다
30
1)
2)
3)
4)
5)
6)
• 시작 정점으로부터 인접한 정점들을 모두 차례로 방문하고 , 방문했던 정점을 시작으로 하여 다시 인접한 정점들을 차례로 방문하는 방식
① 시작 정점 v 를 결정하여 방문하고 방문 표시를 한다 .② 정점 v 에 인접한 정점들 중에서 방문하지 않은 정점을 차례로
방문하면서 큐에 enQueue 한다 .③ 방문하지 않은 인접한 정점이 없으면 , 방문했던 정점에서 인접한
정점들을 다시 차례로 방문하기 위해 큐에서 deQueue 하여 구한 정점에서 를 반복한다 .
④ 큐가 공백이 될 때까지 ~ 을 반복한다 .
3.2 너비우선 탐색 (BFS)
31
• 초기상태– 배열 visited 를 false 로 초기화하고 공백 큐를 생성
32
① 정점 A 를 시작으로 너비우선 탐색을 시작한다 .
visited[A] ← true;A 방문 ;
33
② 방문하지 않은 정점 A 의 모든 인접정점 B, E 를 방문하고 , 큐에 enQueue 한다 .
visited[( 방문하지 않은 A 의 인접정점 B 와 E)] ← true;( 방문하지 않은 A 의 인접정점 B 와 E) 방문 ;enQueue(Q, ( 방문하지 않은 A 의 인접정점 B 와 E));
34
B 와 E 에 방문
③ 정점 A 에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하여 정점 B 를 구한다 .
v ← deQueue(Q);
35
④ 방문하지 않은 정점 B 의 인접정점 C 를 방문하고 큐에 enQueue
visited[( 방문하지 않은 B 의 인접정점 C)] ← true;( 방문하지 않은 B 의 인접정점 C 방문 ;enQueue(Q, ( 방문하지 않은 B 의 인접정점 C));
36
⑤ 정점 B 에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하여 정점 E 를 구한다 .
v ← deQueue(Q);
37
⑥ 정점 E 의 방문하지 않은 인접정점 F 를 방문하고 큐에 enQueue
visited[( 방문하지 않은 E 의 인접정점 F)] ← true;( 방문하지 않은 E 의 인접정점 F 방문 ;enQueue(Q, ( 방문하지 않은 E 의 인접정점 F));
38
⑦ 정점 E 에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하여 정점 C 를 구한다 .
v ← deQueue(Q);
39
⑧ 방문하지 않은 정점 C 의 인접정점 D 를 방문하고 큐에 enQueue
visited[( 방문하지 않은 C 의 인접정점 D)] ← true;( 방문하지 않은 C 의 인접정점 D) 방문 ;enQueue(Q, ( 방문하지 않은 C 의 인접정점 D));
40
⑨ 정점 C 에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하여 정점 F 를 구한다 .
v ← deQueue(Q);
41
⑩ 정점 F 에는 방문하지 않은 인접정점이 없으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하여 정점 D를 구한다 .
v ← deQueue(Q);
42
⑪ 방문하지 않은 정점 D 의 인접정점이 없으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue 하는데 큐가 공백이므로 너비우선 탐색을 종료한다 .
• 그래프 G 의 너비우선 탐색 경로는 A—B—E—C—F—D 이다 .
43
• 신장 트리 (spanning tree)– n 개의 정점으로 이루어진 무방향 그래프 G 에서 n 개의 모든
정점과 n-1 개의 간선으로 만들어진 트리– 최소의 간선을 이용해 모든 정점을 연결한 그래프
• 깊이우선 신장 트리 (depth first spanning tree) – 깊이우선 탐색을 이용하여 생성된 신장 트리
• 너비우선 신장 트리 (breadth first spanning tree)– 너비우선 탐색을 이용하여 생성된 신장 트리
4. 신장 트리와 최소비용 신장 트리
44
• G1 의 깊이우선 신장 트리 및 너비우선 신장 트리
4. 신장 트리와 최소비용 신장 트리
45
• 그래프 G1 과 신장 트리의 예
4. 신장 트리와 최소비용 신장 트리
46
• 최소비용 신장 트리 (MCST: Minimum Cost Spanning Tree)– 주어진 무방향 가중치 그래프의 신장 트리 중 전체 가중치의 합이
최소가 되는 트리
• 활용분야 – 도로의 길이가 최소가 되도록 하는 도로망 건설– 최소의 네트워크 선을 사용하여 시스템을 연결해야 하는 통신망
설계
• 최소비용 신장 트리를 만드는 알고리즘– 크루스칼 (Kruskal) 알고리즘와 프라임 (Prime) 알고리즘
4.1 최소비용 신장 트리
47
• Greedy Algorithm 의 일종– “ 일단 가설 비용이 제일 싼 것부터 먼저 건설하고 보자”– “ 당장 눈앞에 보이는 이득을 추구하는 것이 추후에 전체적으로
크게 봐도 이득이 된다”
4.2 크루스칼 알고리즘
48
❶ 그래프 G 의 모든 간선을 가중치에 따라 오름차순으로 정리한다 . ❷ 그래프 G 에 가중치가 가장 작은 간선을 삽입한다 . 이때 사이클을
형성하는 간선은 삽입할 수 없으므로 이런 경우에는 그 다음으로 가중치가 작은 간선을 삽입한다 .
❸ 그래프 G 에 n – 1 개의 간선을 삽입할 때까지 를 반복한다❷ . ❹ 그래프 G 의 간선이 n - 1 개가 되면 최소비용 신장 트리가 완성된다 .
• Kruskal 알고리즘을 이용하여 G 의 최소 비용 신장 트리 만들기 초기 상태 : 그래프 G 의 간선을 가중치에 따라서 오름차순 정렬
49
① 가중치가 가장 작은 간선 (E,G) 삽입 .– ( 현재 삽입한 간선의 수 : 1 개 )
50
② 나머지 간선 중에서 가중치가 가장 작은 간선 (A,B) 삽입 . – ( 현재 삽입한 간선의 수 : 2 개 )
51
③ 나머지 간선 중에서 가중치가 가장 작은 간선 (E,F) 삽입 . – ( 현재 삽입한 간선의 수 : 3 개 )
52
④ 나머지 간선 중에서 가중치가 가장 작은 간선 (B,D) 삽입 . – ( 현재 삽입한 간선의 수 : 4 개 )
53
⑤ 나머지 간선 중에서 가중치가 가장 작은 간선 (A,D) 를 삽입하면 A-B-D 의 사이클이 생성되므로 삽입할 수 없다 . 그 다음으로 가중치가 가장 작은 간선 (C,F) 삽입 . – ( 현재 삽입한 간선의 수 : 5 개 )
54
• ⑥ 나머지 간선 중에서 가중치가 가장 작은 간선 (D,E) 삽입 . – ( 현재 삽입한 간선의 수 : 6 개 ) – 현재 삽입한 간선의 수가 6 개 이므로 알고리즘 수행을 종료하고 신장 트리 완성
55
• G 의 최소 비용 신장 트리
56
• 간선을 정렬하지 않고 하나의 정점에서 시작하여 트리를 확장해나가는 방법이다 .
4.3 프라임 (Prime) 알고리즘
57
❶ 그래프 G 에서 시작 정점을 선택한다 . ❷ 선택한 정점에 부속된 모든 간선 중에서 가중치가 가장 작은 간선을
연결하여 트리를 확장한다 . ❸ 이전에 선택한 정점과 새로 확장된 정점에 부속된 모든 간선 중에서
가중치가 가장 작은 간선을 삽입한다 . 이때 사이클을 형성하는 간선은 삽입할 수 없으므로 그 다음으로 가중치가 작은 간선을 선택한다 .
❹ 그래프 G 에 n - 1 개의 간선을 삽입할 때까지 을 반복한다❸ . ❺ 그래프 G 의 간선이 n - 1 개가 되면 최소비용 신장 트리가 완성된다 .
• Prime 알고리즘을 이용하여 G 의 최소 비용 신장 트리 만들기– 초기 상태 : 그래프 G 의 정점 중에서 정점 A 를 시작 정점으로 선택
58
① 정점 A 에 부속된 간선 중에서 가중치가 가장 작은 간선 (A,B) 을 삽입하여 트리 확장 . – ( 현재 삽입한 간선의 수 : 1 개 )
59
② 현재 확장된 트리의 정점 A, B 에 부속된 간선 중에서 가중치가 가장 작은 간선 (B,D) 를 삽입하여 트리 확장 . – ( 현재 삽입한 간선의 수 : 2 개 )
60
③ 현재 확장된 트리의 정점 A, B, D 에 부속된 간선 중에서 가중치가 가장 작은 간선 (A,D) 를 삽입하면 A-B-D 의 사이클이 생성되므로 삽입할 수 없다 . 따라서 그 다음으로 가중치가 가장 작은 간선 (D,E) 삽입 .– ( 현재 삽입한 간선의 수 : 3 개 , 삽입 불가능한 간선 : (A,D))
61
④ 현재 확장된 트리의 정점 A, B, D, E 에 부속된 간선 중에서 가중치가 가장 작은 간선 (E,G) 를 삽입하여 트리 확장 . – ( 현재 삽입한 간선의 수 : 4 개 , 삽입 불가능한 간선 : (A,D))
62
⑤ 현재 확장된 트리의 정점 A, B, D, E, G 에 부속된 간선 중에서 가중치가 가장 작은 간선 (E,F) 를 삽입하여 트리 확장 . – ( 현재 삽입한 간선의 수 : 5 개 , 삽입 불가능한 간선 : (A,D))
63
⑥ 현재 확장된 트리의 정점 A, B, D, E, F, G 에 부속된 간선 중에서 가중치가 가장 작은 간선 (C,F) 를 삽입하여 트리 확장 . – ( 현재 삽입한 간선의 수 : 6 개 , 삽입 불가능한 간선 : (A,D)) – 현재 남은 간선의 수가 6 개 이므로 알고리즘 수행을 종료하고 신장 트리 완성 .
64
• G 의 최소 비용 신장 트리
65