1 / 116

제 7 장 그래프

제 7 장 그래프. 그래프의 정의 그래프의 표현 그래프 순회 연산 최소 비용 스패닝 트리 절단점과 이중연결 요소 최단 경로 문제 작업 네트워크.

mahola
Download Presentation

제 7 장 그래프

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. 제 7장 그래프 • 그래프의 정의 • 그래프의 표현 • 그래프 순회 연산 • 최소 비용 스패닝 트리 • 절단점과 이중연결 요소 • 최단 경로 문제 • 작업 네트워크

  2. ○ 그래프의 유래- 1736년 쾨니스버그 다리 문제를 해결하기 위해서 오일러가 최초로 사용·두 개의 섬과 일곱 개의 다리로 구성된 지역에서 모든 다리를 정확히 한번씩만 거쳐 다시 시작점으로 돌아올 수 있는가를 결정하는 문제·오일러가 불가능하다는 것을 증명·모든 지점과 연결된 다리의 수가 짝수여야만 가능 → 들어오는 길이 있으면 나가는 길이 있어야 가능

  3. 오일러 : 쾨니스버그 다리 문제를 프래프를 사용하여 표현·지점 → 정점, 다리 → 간선- 그래프 : 비선형적인 자료들을 표현하기 위해 사용

  4. 1 그래프의 정의○ 그래프(graph)의 정의- 그래프 G : 집합 V와 E로 구성· V : 공집합이 아닌 정점(vertex)들의 유한 집합· E : 간선(edge)들의 유한 집합- 그래프의 표기 G=(V, E)로 나타내며, G의 정점 집합은 V(G)로 간선 집합은 E(G)로 표기

  5. ○ 그래프의 분류(1) 간선들의 방향성 유무에 따른 분류 무방향 그래프(undirected graph) ·간선에 방향이 없는 그래프·(v0, v1) : 정점 v0와 v1 사이의 간선 (v0, v1) = (v1, v0)방향 그래프(directed graph, digraph) ·간선에 방향이 부여된 그래프 ·<v0, v1> : 정점 v0와 v1 사이의 간선<v0, v1> ≠ <v1, v0>

  6. -<예> (a)무방향그래프 G1 (b)방향그래프 G2 G1 = ({a, b, c, d}, {(a, b), (b, c), (c, d), (d, a)}) G2 = ({a, b, c, d}, {<a, b>,<b, c>,<c, d>,<d, a>}) a b a b d c d c

  7. (2) 다중 간선이나 루프의 존재 유무에 따른 분류 단순 그래프(simple graph)·루프(loop)나 다중 간선(multiple edge)을 갖지 않는 그래프 다중 그래프(multigraph)·루프(loop)나 다중 간선(multiple edge)을 갖는 그래프 루프 다중간선(multiple edge) a b c

  8. (3) 기타 특수 그래프 완전 그래프(complete graph) ·모든 정점들 사이에 간선이 존재하는 그래프·정점의 개수가 n개인 완전 그래프(Kn ) 무방향 그래프 : 간선의 개수 → n(n-1)/2방향 그래프 : 간선의 개수 → n(n-1)정규 그래프(regular graph) ·모든 정점의 차수가 같은 그래프· k-정규 그래프 : 모든 정점의 차수가 k인 그래프

  9. 이분할 그래프(bipartite graph) ·정점 집합 V를 두 개의 부분집합 X와 Y로 분할·X에 있는 정점과 Y에 있는 정점 사이에만 간선이 존재하는 그래프·완전 이분할 그래프 : 집합 X에 속해있는 모든 정점들과 집합 Y에 속해있는 모든 정점들 사이에 간선이 존재트리 그래프(tree graph) ·사이클이 존재하지 않는 연결된 그래프

  10. (a)완전그래프 (b)2-정규그래프 (c)이분할그래프 (d)트리그래프○ 용어 정의 - 두 정점이 하나의 간선에 의해 서로 연결된 경우·두 정점은 서로 인접(adjacent) 관계 ·간선의 두 정점에 부속(incident) 관계·<예> 간선 (v, w)가 존재 → 정점 v와 w는 서로 인접하고 간선 (v, w)는 정점 v와 w에 부속

  11. 경로(path) ·1≤i<n에 대해 간선 (vi, vi+1)이 존재할 때, 정점들의 나열 v1, v2, …, vn·단순 경로(simple path) : v1과 vn을 제외한 경로 상에 있는 모든 정점들이 서로 다른 경로 → 경로의 길이 : 경로 내의 간선의 수·부그래프(subgraph) G=(V, E), G'=(V', E')에 대해, V'(G')⊆V(G), E'(G')⊆E(G) → G'가 G의 부그래프

  12. ·유도 부그래프(induced subgraph) G'가 G의 부그래프이고 G'의 임의의 정점 v, w에 대하여 (v, w)∈E(G)일 때 (v, w)∈E'(G') → G'는 G의 유도 부그래프(a)G=(V,E) (b)G'=(V',E') G=({a,b,c,d},{(a,b),(a,c),(a,d),(b,c),(c,d)}) G'=({a,b,c},{(a,b),(a,c),(b,c)}) a b a b d c c

  13. 연결 요소(connected component)·최대 연결 유도 부그래프(maximal connected induced subgraph)·최대 연결 유도 부그래프 그 연결 부그래프를 포함하는 더 큰 다른 연결 부그래프가 존재하지 않는 그래프·<예>비연결 그래프의 연결 요소(a)비연결 그래프 (b)연결요소

  14. 강한 연결 그래프(strongly connected graph)·임의 두 정점 v와 w에 대하여, v에서 w로의 경로가 존재할 뿐만 아니라w에서 v로 가는 경로 또한 존재하는 방향 그래프·강한 연결 요소(strongly connected component) :최대 강한 연결 유도 부그래프(maximal strongly connected induced subgraph)

  15. <예> 강한 연결 그래프- 사이클(cycle)·시작점과 끝점이 같은 길이가 3 이상인 단순 경로·순환 그래프(cyclic graph) : 하나이상의 사이클을 갖는 그래프·트리 : 사이클을 갖지 않는 비순환 그래프(acyclic graph)

  16. ·트리의 성질① n(≥1)개의 정점을 갖는 모든 트리는 정확히 (n-1)개의 간선을 가짐② 트리에 하나의 간선을 추가하면 사이클이 형성됨- 정점의 차수(degree) : 그 정점에 부속된 간선의 수·방향 그래프에서 정점의 진입 차수(in-degree) : 그 정점으로 들어오는 간선의 수

  17. ·방향 그래프에서 정점의 진출 차수(out-degree) : 그 정점에서 나가는 간선의 수·간선의 수와 정점들의 차수와의 관계 정점의 수 : n , 간선의 수 : e, 정점 i의 차수 : di간선의수(e) =

  18. 그래프의 추상 데이터 타입class Graph {데이터 객체 : 공집합이 아닌 정점들의 집합과 무방향 간선들의 집합.각각의 간선은 정점들의 쌍이다.연산 : CreatGraph(); /* 공백 그래프를 생성 */ void InsertVertex(Vertex v); /* 그래프에 정점 v를 삽입 */ /* v는 부속된 간선을 갖지 아니함 */. void InsertEdge(Vertex u, Vertex v); /* 간선 (u, v)를 그래프에 삽입 */

  19. void DeleteVertex(Vertex v); /* 정점v와v에 부속된모든 간선을 제거 */void DeleteEdge(Vertex u, Vertex v); /* 간선 (u, v)를 제거 */Boolean IsEmpty(); /* 만약 그래프가 정점을 갖지 않으면 True(1)를 그렇지 않으면 False(0)를 반환 */List<Vertex> Adjacent(Vertex v); /* 정점 v와 인접한 모든 정점들의 리스트를 반환 */ };

  20. 2 그래프의 표현○ 그래프 표현 방법① 인접 행렬(adjacency matrix) - 정점들 사이의 인접 관계를 나타내는 행렬을 이용하여 표현- G=(V, E) : n개의 정점을 갖는(|V(G)|=n≥1) 그래프A : 인접 행렬A = (aij) : 2차원 n×n 배열.

  21. 장점·두 정점 사이에 간선이 있는지 결정이 용이·정점의 차수(degree) 계산이 용이 → 정점 i의 차수 = → 방향 그래프(digraph) 진출 차수(out-degree) = 행의 합 진입 차수(in-degree) = 열의 합-단점·그래프 내에 간선의 수를 계산하거나 또는 그래프가 연결 그래프인지를 결정 → 많은 시간을 요구 : O(n2)

  22. ② 인접 리스트(adjacent list) - 정점의 수가 n일 경우, n개의로 연결 리스트로 표현- 장점 ·정점의 차수(degree)는 그 리스트 내의 노드 수로서 쉽게 구할 수 있음· n개의 노드를 갖는 그래프에서 간선의 수를 결정하는데 드는 시간 : O(e+n) - 단점 ·방향 그래프(digraph) 표현시 진입 차수(in-degree)결정이 어려움 → 방향 그래프의 역 인접 리스트(inverse adjacency list)를 유지하여 해결

  23. (a)그래프(b)인접행렬 a b c d

  24. (c)인접리스트-가중치 간선의 표현 :·인접 행렬 : 원소 값을 가중치·인접 리스트 : 가중치 필드를 추가

  25. 노드 구조와 자료구조enum Bool { False, True}; struct GraphNode{ Type vertex; struct GraphNode* link;};typedef struct GraphNode GNode;struct Graph{

  26. int size; /* 정점의 개수 */ enum Bool* visited; /* 정점의 방문 여부를 나타내는 배열 */ GNode** graph; /* 각 리스트의 첫 번째 노드를 가리키는 포인터 배열 */ GNode** tail; /* 각 리스트의 마지막 노드를 가리키는 포인터 배열 */};

  27. -<예> struct GraphNode 4 0

  28. 3 그래프 순회 연산- 그래프 순회 ·그래프의 모든 노드를 방문·그래프 순회 방법 깊이우선탐색 너비우선탐색3.1 깊이 우선 탐색(DFS)- 깊이 우선 탐색 방법① 시작 정점 v를 방문

  29. ② v에 인접한 정점 중 방문되지 않은 정점 w를 선택하여 DFS를 다시 시작③ 인접한 모든 정점이 이미 방문된 정점 u를 만나면,방문되지 않은 인접된 정점을 가진 마지막 정점으로 되돌아가서 DFS를 다시 시작 → 스택사용④ 더 이상 방문할 정점이 없을 때까지 위 과정을 반복- 알고리즘void DFS(v) Type v; {

  30. visited[v] = True; for(v에 인접한 각 정점 w에 대해) /* 실제 코드는 그래프 표현 방법에 의존 */ if( !visited[w] ) DFS(w); } - 알고리즘 분석·인접 리스트로 그래프를 표현한 경우 시간 복잡도 : O(e)·인접 행렬로 그래프를 표현한 경우 시간 복잡도 : O(n2)

  31. -<예>깊이 우선 탐색·방문되는 순서 : 0,1,3,7,4,9,8,5,2,6 (a)그래프 (b)인접 리스트 0 1 2 3 4 5 6 8 7 9

  32. 3.2 너비 우선 탐색(BFS)- 너비 우선 탐색 방법① 시작 정점 v를 결정하여 방문② 정점 v에 인접하며, 방문이 안된 모든 정점들을 방문 다시 이들 새롭게 방문한 정점들에 인접하며 방문되지 않은 모든 정점들을 방문 → 큐를 사용③ 더 이상 방문할 정점들이 없을 때까지 위의 과정을 반복

  33. 알고리즘void BFS(v) Type v; { QInsert(v); /* 정점 v을 큐에 삽입 */ visited[v]=True; while( !IsQEmpty() ){ /* 큐가 비어있지 않을 때 반복문 수행 */ v = QDelete(); for(v에 인접한 모든 정점 w에 대해) /* 실제 코드는 그래프 표현법에 의존 */

  34. if( !visited[w] ){ QInsert(w); visited[w]=True; } } }- 알고리즘 분석·인접 리스트로 표현한 경우 시간 복잡도 : O(e)·인접 행렬로 표현한 경우 시간 복잡도 : O(n2)

  35. -<예>너비 우선 탐색 :·방문되는 순수 : 0,1,2,3,4,5,6,7,8,9 0 1 2 3 4 5 6 8 7 9

  36. 3.3 연결 요소- 연결 요소(connected component)·그래프 내의 최대 연결 유도 부그래프- 연결 요소 찾기 ·BFS와 DFS알고리즘을 사용하여 찾을 수 있음·방법① 임의의 한 정점에서 시작, BFS또는 DFS알고리즘을 적용하여 그 정점과 연결된 모든 정점들을 방문 ② 방문된 정점들로 구성된 유도 부그래프(induced subgraph)가 원래 그래프의 하나의 연결 요소가 됨

  37. ③ 아직 방문되지 않은 정점을 선택하고 다시 이정점에서 시작하여 동일한 방법으로 또 다른 연결 요소를 찾을 수 있음- 알고리즘void Components(g) struct Graph *g; { int i; g->visited = (enum Bool*) malloc(g->size * sizeof(enum Bool)); for(i=0; i < g->size; ++i) g->visited[i] = False; for(i=0; i < g->size; ++i)

  38. if( !g->visited[i] ) { printf("\n 연결 요소 : "); DFS(g, i); /* 하나의 연결 요소를 찾음 */ } free(g->visited); }- 알고리즘 분석·수행 시간 : DFS를 수행하는데 소요되는 시간에 의존·인접 행렬로 표현한 경우 시간 복잡도 : O(n2)·인접 리스트로 표현한 경우 시간 복잡도 : O(n+e)- 연결 요소 구하는 프로그램 P.256-263

  39. 4 최소 비용 스패닝 트리○ 스패닝 트리(spanning tree)- 그래프 G의 모든 정점들을 포함하고 G의 간선들로만 구성된 트리(a)그래프 G (b)스패닝 트리 (c)스패닝 트리 (d)스패닝 트리 v w v w v w v w z y x z y x z y x z y x

  40. BFS와 DFS에 의해 만들어진 스패닝 트리·BFS 스패닝 트리·DFS 스패닝 트리-그래프 G의 스패닝 트리를 G'라 할 때 스패닝 트리가 갖는 성질① 스패닝 트리에 속하지 않은 그래프 G의 간선을 스패닝 트리에 추가하면 사이클이 형성② 스패닝 트리는 V(G') = V(G)이고, G'는 연결된 G의 최소 부그래프(minimal subgraph)최소 부그래프 : 가장 적은 수의 간선을 갖는 부그래프

  41. 비용 스패닝 트리(minimum cost spanning tree)·스패닝 트리의 간선에 부과된 가중치들의 합이 최소인 스패닝 트리-<예> 최소 비용 스패닝 트리 구하기(a) 가중치 그래프 (b)최소 비용 스패닝 트리 비용 스패닝 트리(minimum cost spanning tree)·스패닝 트리의 간선에 부과된 가중치들의 합이 최소인 스패닝 트리-<예> 최소 비용 스패닝 트리 구하기(a) 가중치 그래프 (b)최소 비용 스패닝 트리 0 0 1 3 1 3 2 2 4 5 4 5

  42. 최소 비용 스패닝 트리의 응용·통신망 설계시 최소의 비용으로 연결하는 통신망 구하기-최소 비용스패닝트리를구하는알고리즘(greedy algorithm)(1) Kruskal 알고리즘- 매 단계에서 최소 가중치를 갖는 간선·선택된 간선이 스패닝트리 내에서 사이클을 이루면 배제·(|V|-1) 개의 간선을 선택

  43. 0 0 (a) 그래프 (b)최소 간선(0,2)선택 1 3 1 3 2 2 4 5 4 5 0 0 1 3 1 3 2 2 4 5 4 5

  44. (e) 최소간선(2,5)선택 (f)(2,3)(0.3):사이클을 형성 간선(1,2)을선택 0 0 1 3 1 3 2 2 4 5 4 5

  45. - 알고리즘T = ;Øwhile((T가 (n-1)보다 적은수의 간선을 포함) &&(E가 공백이아님)){ E로부터 가장 작은 비용을 갖는 간선 (v, w)를 선택; E로부터 간선 (v, w)를 제거; if((v, w)가 T내에서 사이클을 형성하지 않음) (v, w)를 T에 추가; else (v, w)를 버림; }

  46. if (T내의 간선의 수가 (n-1)보다 작음) printf(" 스패닝 트리가 없다. n");- 알고리즘 분석 시간 복잡도 : 간선들을 정렬하는데 걸리는 시간 O(elog2e)(2) Prim 알고리즘- 임의의 단일 정점에서 시작하여 스패닝 트리 내에 있는 모든 정점들과 인접한 간선들 중에서 최소 비용을 가지며, 사이클을 형성하지 않는 간선을 선택- (|V|-1) 개의 간선이 선택

  47. 0 0 (a) 그래프 (b)최소 간선(0,2)선택 1 3 1 3 2 2 4 5 4 5 0 0 1 3 1 3 2 2 4 5 4 5

  48. 0 0 (f)(0,3)(2.3):사이클을 형성 간선 (e) 최소간선(1,4)선택(1,2)을 선택 1 3 1 3 2 2 4 5 4 5

  49. for(T= ; T내의 간선의 수가 (n-1)보다 적음 ; (u, v)를 T에 추가) { (u ∈TV)이고 (v TV)인 조건을 만족하는 간선(u, v)중에서 최소 비용 간선을 선택; if(더 이상 그러한 간선이 없음) break; v를 TV에 추가; } if(T내의 간선의 수가 (n-1) 보다 적음) printf(" 스패닝 트리가 없다. n");

  50. 알고리즘 분석·매 단계에서 하나씩 정점을 선택하며, 모두 n개의 정점을 선택·시간 복잡도 : O(n2)5 절단점과 이중 연결 요소○ 문제 정의- 통신이나 수송 망에서 문제·한 정점과 그에 부속된 간선이 제거되었을 때 망이 분리되어 통신이 두절되는지 결정하는 문제- 절단점(articulation point 또는 cut vertex)

More Related