1 / 65

10 장 . 그래프 (Graph) 1 절 . 그래프 2 절 . 그래프 표현 3 절 . 그래프 탐색 4 절 . 신장트리 및 최소비용 신장트리

10 장 . 그래프 (Graph) 1 절 . 그래프 2 절 . 그래프 표현 3 절 . 그래프 탐색 4 절 . 신장트리 및 최소비용 신장트리. 이 완 직 ( wjlee@pnu.ac.kr ) 2010 년 1 학기. 1. 그래프. 선형 자료구조나 트리 자료구조로 표현하기 어려운“多 : 多”의 관계를 가지는 원소들을 표현하기 위한 자료구조 정점 (vertex) 과 간선 (edge) 들의 집합. 1.1 그래프 종류. 무방향 그래프

Download Presentation

10 장 . 그래프 (Graph) 1 절 . 그래프 2 절 . 그래프 표현 3 절 . 그래프 탐색 4 절 . 신장트리 및 최소비용 신장트리

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 10장. 그래프(Graph) 1절. 그래프 2절. 그래프 표현 3절. 그래프 탐색 4절. 신장트리 및 최소비용 신장트리 이 완 직 (wjlee@pnu.ac.kr) 2010년 1학기

  2. 1. 그래프 • 선형 자료구조나 트리 자료구조로 표현하기 어려운“多:多”의 관계를 가지는 원소들을 표현하기 위한 자료구조 • 정점(vertex)과 간선(edge)들의 집합

  3. 1.1 그래프 종류 • 무방향 그래프 • 두 정점을 연결하는 간선의 방향이 없는 그래프로서 양방향으로 갈 수 있다. 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)}

  4. 1.1 그래프 종류 • 방향 그래프 • 간선이 방향을 가지고 있는 그래프로서 도로의 일방통행 길처럼 간선을 통하여 한쪽 방향으로만 갈수 있다. 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>}

  5. 1.1 그래프 종류 • 완전 그래프 • 각 정점에서 다른 모든 정점을 연결하여 가능한의 최대 간선수를 가진 그래프이다.

  6. 1.1 그래프 종류 • 부분 그래프 • 원래의 그래프에서 일부의 정점이나 간선을 제외하여 만든 그래프 • 그래프 G와 부분 그래프 G'는 다음과 같은 관계를 갖는다. V(G')⊆V(G),  E(G')⊆E(G)

  7. 1.1 그래프 종류 • 가중치 그래프(weighted graph) 또는 네트워크(network) 간선에 비용이나 가중치가 할당된 그래프

  8. 1.2 그래프 관련 용어 • 인접 정점(adjacent vertex) • 간선에 의해 연결된 정점을 의미한다. • 차수(degree) • 정점에 부속되어 있는 간선의 수를 말한다. • 방향 그래프의 진입차수(in-degree) • 정점을 머리로 하는 간선의 수로서 외부에서 오는 간선의 수 • 방향 그래프의 진출차수(out-degree) • 정점을 꼬리로 하는 간선의 수의 수로서 외부로 향하는 간선의 수 • 경로(path) • 그래프에서 간선을 따라 갈 수 있는 길을 순서대로 나열한 것.

  9. 1.2 그래프 관련 용어 • 경로길이(path length) • 경로를 구성하는 간선의 수 • 사이클(cycle) • 단순경로 중에서 경로의 시작 정점과 마지막 정점이 같은 경로 • 그래프와 트리의 차이점 • 트리는 사이클을 허용하지 않는다.

  10. 2. 그래프의 표현 • 그래프를 표현 • 정점에 대한 집합과 정점에 부속된 간선이 집합을 표현 • 그래프를 구현하기 위해서 필요한 연산

  11. 2.1 인접 행렬(adjacent matrix) • 행렬에 대한 2차원 배열을 사용하는 순차 자료구조 방법으로서 그래프를 메모리에 표현한 것

  12. [예제 10-1] 인접 행렬

  13. 2.2 인접 리스트(adjacent list) • 각 정점에 대한 인접 정점들을 단순 연결 리스트로 표현한 것

  14. [예제 10-2] 인접 리스트

  15. [예제 10-2] 수행 결과

  16. 3. 그래프 탐색 • 그래프의 가장 기본적인 연산으로, 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것 • 그래프 탐색의 2가지 방법 • 깊이 우선 탐색(DFS: depth-first search) • 너비우선 탐색(BFS: breadth-first search)

  17. 3.1 깊이우선 탐색(DFS) • 한 방향으로 갈 수 있을 만큼 계속 가다가 더 이상 갈 수 없게 되면,가장 마지막에 만났던 갈림길 간선이 있는 정점으로 되돌아온 후, 이곳으로부터 다른 방향의 간선으로 탐색을 계속 반복하여 결국 모든 정점을 방문하는 방법이다. • 그래프의 시작 정점 v를 결정하여 방문하고 방문하였다는 표시를 한다. • 정점 v에 인접한 정점 중에서 아직 방문하지 않은 정점 w가 있으면 정점 v를 스택에 push하고 w를 방문한다. 그리고 w를 v로 하여 다시 를 반복한다. 방문하지 않은 정점이 없으면,탐색의 방향을 바꾸기 위해 스택을 pop하여 받은 가장 마지막 방문 정점을 v로 하여 다시 를 수행한다. • 스택이 공백이 될 때까지 를 반복한다.

  18. 3.1 깊이우선 탐색(DFS) • 그래프 G에 대한 깊이우선 탐색 알고리즘 • 초기상태 • 배열 visited를 false로 초기화하고 공백 스택을 생성

  19. 3.1 깊이우선 탐색(DFS) • 정점 A를 시작으로 깊이우선 탐색을 시작한다. visited[A] ← true; A 방문;

  20. 정점 A에 방문하지 않은 정점 B, E가 있으므로 A를 스택에 push하고 인접정점 B와 E 중, 오름차순에 따라 B를 선택하여 탐색을 계속 push(stack, A); visited[B] ← true; B 방문;

  21. 정점 B에 방문하지 않은 정점 C, D가 있으므로 B를 스택에 push하고 인접정점 C와 D 중에서 오름차순에 따라 C를 선택하여 탐색을 계속 push(stack, B); visited[C] ← true; C 방문

  22. 정점 C에 방문하지 않은 정점 D, E가 있으므로 C를 스택에 push하고 인접정점 D와 E 중 오름차순에 따라 D를 선택하여 탐색을 계속 push(stack, C); visited[D] ← true; D 방문;

  23. 정점 D에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로 돌아가기 위해서 스택을 pop하여 받은 정점 C에 대하여 방문하지 않은 인접정점이 있는지 확인한다. pop(stack);

  24. 정점 C에 방문하지 않은 정점 E가 있으므로 C를 스택에 push하고 인접정점 E를 선택하여 탐색을 계속한다. push(stack, C); visited[E] ← true; E 방문;

  25. 정점 E에 방문하지 않은 정점 F가 있으므로 E를 스택에 push하고 인접정점 F를 선택하여 탐색을 계속한다. push(stack, E); visited[F] ← true; F 방문;

  26. 정점 F에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로 돌아가기 위해서 스택을 pop하여 받은 정점 E에 대하여 방문하지 않은 인접정점이 있는지 확인한다. pop(stack);

  27. 정점 E에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로 돌아가기 위해서 스택을 pop하여 받은 정점 C에 대하여 방문하지 않은 인접정점이 있는지 확인한다. pop(stack);

  28. 정점 C에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로 돌아가기 위해서 스택을 pop하여 받은 정점 B에 대하여 방문하지 않은 인접정점이 있는지 확인한다. pop(stack);

  29. 정점 B에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로 돌아가기 위해서 스택을 pop하여 받은 정점 A에 대하여 방문하지 않은 인접정점이 있는지 확인한다. pop(stack);

  30. A에 방문하지 않은 인접 정점이 없고, 스택도 공백이므로 종료 • 스택 탐색한 경로 순서는 A-B-C-D-E-F이다 1) 5) 2) 3) 6) 4)

  31. 3.2 너비우선 탐색(BFS) • 시작 정점으로부터 인접한 정점들을 모두 차례로 방문하고, 방문했던 정점을 시작으로 하여 다시 인접한 정점들을 차례로 방문하는 방식 • 시작 정점 v를 결정하여 방문하고 방문 표시를 한다. • 정점 v에 인접한 정점들 중에서 방문하지 않은 정점을 차례로 방문하면서 큐에 enQueue한다. • 방문하지 않은 인접한 정점이 없으면, 방문했던 정점에서 인접한 정점들을 다시 차례로 방문하기 위해 큐에서 deQueue하여 구한 정점에서 를 반복한다. • 큐가 공백이 될 때까지 ~을 반복한다.

  32. 초기상태 • 배열 visited를 false로 초기화하고 공백 큐를 생성

  33. 정점 A를 시작으로 너비우선 탐색을 시작한다. visited[A] ← true; A 방문;

  34. 방문하지 않은 정점 A의 모든 인접정점 B, E를 방문하고, 큐에 enQueue한다. visited[(방문하지 않은 A의 인접정점 B와 E)] ← true; (방문하지 않은 A의 인접정점 B와 E) 방문; enQueue(Q, (방문하지 않은 A의 인접정점 B와 E)); B와 E에 방문

  35. 정점 A에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 B를 구한다. v ← deQueue(Q);

  36. 방문하지 않은 정점 B의 인접정점 C를 방문하고 큐에 enQueue visited[(방문하지 않은 B의 인접정점 C)] ← true; (방문하지 않은 B의 인접정점 C 방문; enQueue(Q, (방문하지 않은 B의 인접정점 C));

  37. 정점 B에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 E를 구한다. v ← deQueue(Q);

  38. 정점 E의 방문하지 않은 인접정점 F를 방문하고 큐에 enQueue visited[(방문하지 않은 E의 인접정점 F)] ← true; (방문하지 않은 E의 인접정점 F 방문; enQueue(Q, (방문하지 않은 E의 인접정점 F));

  39. 정점 E에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 C를 구한다. v ← deQueue(Q);

  40. 방문하지 않은 정점 C의 인접정점 D를 방문하고 큐에 enQueue visited[(방문하지 않은 C의 인접정점 D)] ← true; (방문하지 않은 C의 인접정점 D) 방문; enQueue(Q, (방문하지 않은 C의 인접정점 D));

  41. 정점 C에 대한 인접정점들을 처리했으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 F를 구한다. v ← deQueue(Q);

  42. 정점 F에는 방문하지 않은 인접정점이 없으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 D를 구한다. v ← deQueue(Q);

  43. 방문하지 않은 정점 D의 인접정점이 없으므로 너비우선 탐색을 계속 수행할 다음 정점을 찾기 위해 큐를 deQueue하는데 큐가 공백이므로 너비우선 탐색을 종료한다. • 그래프 G의 너비우선 탐색 경로는A—B—E—C—F—D이다.

  44. 4. 신장 트리와 최소비용 신장 트리 • 신장 트리(spanning tree) • n개의 정점으로 이루어진 무방향 그래프 G에서 n개의 모든 정점과 n-1개의 간선으로 만들어진 트리 • 최소의 간선을 이용해 모든 정점을 연결한 그래프 • 깊이우선 신장 트리(depth first spanning tree) • 깊이우선 탐색을 이용하여 생성된 신장 트리 • 너비우선 신장 트리(breadth first spanning tree) • 너비우선 탐색을 이용하여 생성된 신장 트리

  45. 4. 신장 트리와 최소비용 신장 트리 • G1의 깊이우선 신장 트리 및 너비우선 신장 트리

  46. 4. 신장 트리와 최소비용 신장 트리 • 그래프 G1과 신장 트리의 예

  47. 4.1 최소비용 신장 트리 • 최소비용 신장 트리(MCST: Minimum Cost Spanning Tree) • 주어진 무방향 가중치 그래프의 신장 트리 중 전체 가중치의 합이 최소가 되는 트리 • 활용분야 • 도로의 길이가 최소가 되도록 하는 도로망 건설 • 최소의 네트워크 선을 사용하여 시스템을 연결해야 하는 통신망 설계 • 최소비용 신장 트리를 만드는 알고리즘 • 크루스칼(Kruskal) 알고리즘와 프라임(Prime) 알고리즘

  48. 4.2 크루스칼 알고리즘 • Greedy Algorithm의 일종 • “일단 가설 비용이 제일 싼 것부터 먼저 건설하고 보자” • “당장 눈앞에 보이는 이득을 추구하는 것이 추후에 전체적으로 크게 봐도 이득이 된다” ❶ 그래프 G의 모든 간선을 가중치에 따라 오름차순으로 정리한다. ❷ 그래프 G에 가중치가 가장 작은 간선을 삽입한다. 이때 사이클을 형성하는 간선은 삽입할 수 없으므로 이런 경우에는 그 다음으로 가중치가 작은 간선을 삽입한다. ❸ 그래프 G에 n – 1 개의 간선을 삽입할 때까지 ❷를 반복한다. ❹ 그래프 G의 간선이 n - 1개가 되면 최소비용 신장 트리가 완성된다.

  49. Kruskal 알고리즘을 이용하여 G의 최소 비용 신장 트리 만들기 초기 상태 : 그래프 G의 간선을 가중치에 따라서 오름차순 정렬

  50. ① 가중치가 가장 작은 간선 (E,G) 삽입. • (현재 삽입한 간선의 수 : 1개)

More Related