1.17k likes | 1.81k Views
제 7 장 그래프. 그래프의 정의 그래프의 표현 그래프 순회 연산 최소 비용 스패닝 트리 절단점과 이중연결 요소 최단 경로 문제 작업 네트워크.
E N D
제 7장 그래프 • 그래프의 정의 • 그래프의 표현 • 그래프 순회 연산 • 최소 비용 스패닝 트리 • 절단점과 이중연결 요소 • 최단 경로 문제 • 작업 네트워크
○ 그래프의 유래- 1736년 쾨니스버그 다리 문제를 해결하기 위해서 오일러가 최초로 사용·두 개의 섬과 일곱 개의 다리로 구성된 지역에서 모든 다리를 정확히 한번씩만 거쳐 다시 시작점으로 돌아올 수 있는가를 결정하는 문제·오일러가 불가능하다는 것을 증명·모든 지점과 연결된 다리의 수가 짝수여야만 가능 → 들어오는 길이 있으면 나가는 길이 있어야 가능
오일러 : 쾨니스버그 다리 문제를 프래프를 사용하여 표현·지점 → 정점, 다리 → 간선- 그래프 : 비선형적인 자료들을 표현하기 위해 사용
1 그래프의 정의○ 그래프(graph)의 정의- 그래프 G : 집합 V와 E로 구성· V : 공집합이 아닌 정점(vertex)들의 유한 집합· E : 간선(edge)들의 유한 집합- 그래프의 표기 G=(V, E)로 나타내며, G의 정점 집합은 V(G)로 간선 집합은 E(G)로 표기
○ 그래프의 분류(1) 간선들의 방향성 유무에 따른 분류 무방향 그래프(undirected graph) ·간선에 방향이 없는 그래프·(v0, v1) : 정점 v0와 v1 사이의 간선 (v0, v1) = (v1, v0)방향 그래프(directed graph, digraph) ·간선에 방향이 부여된 그래프 ·<v0, v1> : 정점 v0와 v1 사이의 간선<v0, v1> ≠ <v1, v0>
-<예> (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
(2) 다중 간선이나 루프의 존재 유무에 따른 분류 단순 그래프(simple graph)·루프(loop)나 다중 간선(multiple edge)을 갖지 않는 그래프 다중 그래프(multigraph)·루프(loop)나 다중 간선(multiple edge)을 갖는 그래프 루프 다중간선(multiple edge) a b c
(3) 기타 특수 그래프 완전 그래프(complete graph) ·모든 정점들 사이에 간선이 존재하는 그래프·정점의 개수가 n개인 완전 그래프(Kn ) 무방향 그래프 : 간선의 개수 → n(n-1)/2방향 그래프 : 간선의 개수 → n(n-1)정규 그래프(regular graph) ·모든 정점의 차수가 같은 그래프· k-정규 그래프 : 모든 정점의 차수가 k인 그래프
이분할 그래프(bipartite graph) ·정점 집합 V를 두 개의 부분집합 X와 Y로 분할·X에 있는 정점과 Y에 있는 정점 사이에만 간선이 존재하는 그래프·완전 이분할 그래프 : 집합 X에 속해있는 모든 정점들과 집합 Y에 속해있는 모든 정점들 사이에 간선이 존재트리 그래프(tree graph) ·사이클이 존재하지 않는 연결된 그래프
(a)완전그래프 (b)2-정규그래프 (c)이분할그래프 (d)트리그래프○ 용어 정의 - 두 정점이 하나의 간선에 의해 서로 연결된 경우·두 정점은 서로 인접(adjacent) 관계 ·간선의 두 정점에 부속(incident) 관계·<예> 간선 (v, w)가 존재 → 정점 v와 w는 서로 인접하고 간선 (v, w)는 정점 v와 w에 부속
경로(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의 부그래프
·유도 부그래프(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
연결 요소(connected component)·최대 연결 유도 부그래프(maximal connected induced subgraph)·최대 연결 유도 부그래프 그 연결 부그래프를 포함하는 더 큰 다른 연결 부그래프가 존재하지 않는 그래프·<예>비연결 그래프의 연결 요소(a)비연결 그래프 (b)연결요소
강한 연결 그래프(strongly connected graph)·임의 두 정점 v와 w에 대하여, v에서 w로의 경로가 존재할 뿐만 아니라w에서 v로 가는 경로 또한 존재하는 방향 그래프·강한 연결 요소(strongly connected component) :최대 강한 연결 유도 부그래프(maximal strongly connected induced subgraph)
<예> 강한 연결 그래프- 사이클(cycle)·시작점과 끝점이 같은 길이가 3 이상인 단순 경로·순환 그래프(cyclic graph) : 하나이상의 사이클을 갖는 그래프·트리 : 사이클을 갖지 않는 비순환 그래프(acyclic graph)
·트리의 성질① n(≥1)개의 정점을 갖는 모든 트리는 정확히 (n-1)개의 간선을 가짐② 트리에 하나의 간선을 추가하면 사이클이 형성됨- 정점의 차수(degree) : 그 정점에 부속된 간선의 수·방향 그래프에서 정점의 진입 차수(in-degree) : 그 정점으로 들어오는 간선의 수
·방향 그래프에서 정점의 진출 차수(out-degree) : 그 정점에서 나가는 간선의 수·간선의 수와 정점들의 차수와의 관계 정점의 수 : n , 간선의 수 : e, 정점 i의 차수 : di간선의수(e) =
그래프의 추상 데이터 타입class Graph {데이터 객체 : 공집합이 아닌 정점들의 집합과 무방향 간선들의 집합.각각의 간선은 정점들의 쌍이다.연산 : CreatGraph(); /* 공백 그래프를 생성 */ void InsertVertex(Vertex v); /* 그래프에 정점 v를 삽입 */ /* v는 부속된 간선을 갖지 아니함 */. void InsertEdge(Vertex u, Vertex v); /* 간선 (u, v)를 그래프에 삽입 */
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와 인접한 모든 정점들의 리스트를 반환 */ };
2 그래프의 표현○ 그래프 표현 방법① 인접 행렬(adjacency matrix) - 정점들 사이의 인접 관계를 나타내는 행렬을 이용하여 표현- G=(V, E) : n개의 정점을 갖는(|V(G)|=n≥1) 그래프A : 인접 행렬A = (aij) : 2차원 n×n 배열.
장점·두 정점 사이에 간선이 있는지 결정이 용이·정점의 차수(degree) 계산이 용이 → 정점 i의 차수 = → 방향 그래프(digraph) 진출 차수(out-degree) = 행의 합 진입 차수(in-degree) = 열의 합-단점·그래프 내에 간선의 수를 계산하거나 또는 그래프가 연결 그래프인지를 결정 → 많은 시간을 요구 : O(n2)
② 인접 리스트(adjacent list) - 정점의 수가 n일 경우, n개의로 연결 리스트로 표현- 장점 ·정점의 차수(degree)는 그 리스트 내의 노드 수로서 쉽게 구할 수 있음· n개의 노드를 갖는 그래프에서 간선의 수를 결정하는데 드는 시간 : O(e+n) - 단점 ·방향 그래프(digraph) 표현시 진입 차수(in-degree)결정이 어려움 → 방향 그래프의 역 인접 리스트(inverse adjacency list)를 유지하여 해결
(a)그래프(b)인접행렬 a b c d
(c)인접리스트-가중치 간선의 표현 :·인접 행렬 : 원소 값을 가중치·인접 리스트 : 가중치 필드를 추가
노드 구조와 자료구조enum Bool { False, True}; struct GraphNode{ Type vertex; struct GraphNode* link;};typedef struct GraphNode GNode;struct Graph{
int size; /* 정점의 개수 */ enum Bool* visited; /* 정점의 방문 여부를 나타내는 배열 */ GNode** graph; /* 각 리스트의 첫 번째 노드를 가리키는 포인터 배열 */ GNode** tail; /* 각 리스트의 마지막 노드를 가리키는 포인터 배열 */};
-<예> struct GraphNode 4 0
3 그래프 순회 연산- 그래프 순회 ·그래프의 모든 노드를 방문·그래프 순회 방법 깊이우선탐색 너비우선탐색3.1 깊이 우선 탐색(DFS)- 깊이 우선 탐색 방법① 시작 정점 v를 방문
② v에 인접한 정점 중 방문되지 않은 정점 w를 선택하여 DFS를 다시 시작③ 인접한 모든 정점이 이미 방문된 정점 u를 만나면,방문되지 않은 인접된 정점을 가진 마지막 정점으로 되돌아가서 DFS를 다시 시작 → 스택사용④ 더 이상 방문할 정점이 없을 때까지 위 과정을 반복- 알고리즘void DFS(v) Type v; {
visited[v] = True; for(v에 인접한 각 정점 w에 대해) /* 실제 코드는 그래프 표현 방법에 의존 */ if( !visited[w] ) DFS(w); } - 알고리즘 분석·인접 리스트로 그래프를 표현한 경우 시간 복잡도 : O(e)·인접 행렬로 그래프를 표현한 경우 시간 복잡도 : O(n2)
-<예>깊이 우선 탐색·방문되는 순서 : 0,1,3,7,4,9,8,5,2,6 (a)그래프 (b)인접 리스트 0 1 2 3 4 5 6 8 7 9
3.2 너비 우선 탐색(BFS)- 너비 우선 탐색 방법① 시작 정점 v를 결정하여 방문② 정점 v에 인접하며, 방문이 안된 모든 정점들을 방문 다시 이들 새롭게 방문한 정점들에 인접하며 방문되지 않은 모든 정점들을 방문 → 큐를 사용③ 더 이상 방문할 정점들이 없을 때까지 위의 과정을 반복
알고리즘void BFS(v) Type v; { QInsert(v); /* 정점 v을 큐에 삽입 */ visited[v]=True; while( !IsQEmpty() ){ /* 큐가 비어있지 않을 때 반복문 수행 */ v = QDelete(); for(v에 인접한 모든 정점 w에 대해) /* 실제 코드는 그래프 표현법에 의존 */
if( !visited[w] ){ QInsert(w); visited[w]=True; } } }- 알고리즘 분석·인접 리스트로 표현한 경우 시간 복잡도 : O(e)·인접 행렬로 표현한 경우 시간 복잡도 : O(n2)
-<예>너비 우선 탐색 :·방문되는 순수 : 0,1,2,3,4,5,6,7,8,9 0 1 2 3 4 5 6 8 7 9
3.3 연결 요소- 연결 요소(connected component)·그래프 내의 최대 연결 유도 부그래프- 연결 요소 찾기 ·BFS와 DFS알고리즘을 사용하여 찾을 수 있음·방법① 임의의 한 정점에서 시작, BFS또는 DFS알고리즘을 적용하여 그 정점과 연결된 모든 정점들을 방문 ② 방문된 정점들로 구성된 유도 부그래프(induced subgraph)가 원래 그래프의 하나의 연결 요소가 됨
③ 아직 방문되지 않은 정점을 선택하고 다시 이정점에서 시작하여 동일한 방법으로 또 다른 연결 요소를 찾을 수 있음- 알고리즘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)
if( !g->visited[i] ) { printf("\n 연결 요소 : "); DFS(g, i); /* 하나의 연결 요소를 찾음 */ } free(g->visited); }- 알고리즘 분석·수행 시간 : DFS를 수행하는데 소요되는 시간에 의존·인접 행렬로 표현한 경우 시간 복잡도 : O(n2)·인접 리스트로 표현한 경우 시간 복잡도 : O(n+e)- 연결 요소 구하는 프로그램 P.256-263
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
BFS와 DFS에 의해 만들어진 스패닝 트리·BFS 스패닝 트리·DFS 스패닝 트리-그래프 G의 스패닝 트리를 G'라 할 때 스패닝 트리가 갖는 성질① 스패닝 트리에 속하지 않은 그래프 G의 간선을 스패닝 트리에 추가하면 사이클이 형성② 스패닝 트리는 V(G') = V(G)이고, G'는 연결된 G의 최소 부그래프(minimal subgraph)최소 부그래프 : 가장 적은 수의 간선을 갖는 부그래프
비용 스패닝 트리(minimum cost spanning tree)·스패닝 트리의 간선에 부과된 가중치들의 합이 최소인 스패닝 트리-<예> 최소 비용 스패닝 트리 구하기(a) 가중치 그래프 (b)최소 비용 스패닝 트리 비용 스패닝 트리(minimum cost spanning tree)·스패닝 트리의 간선에 부과된 가중치들의 합이 최소인 스패닝 트리-<예> 최소 비용 스패닝 트리 구하기(a) 가중치 그래프 (b)최소 비용 스패닝 트리 0 0 1 3 1 3 2 2 4 5 4 5
최소 비용 스패닝 트리의 응용·통신망 설계시 최소의 비용으로 연결하는 통신망 구하기-최소 비용스패닝트리를구하는알고리즘(greedy algorithm)(1) Kruskal 알고리즘- 매 단계에서 최소 가중치를 갖는 간선·선택된 간선이 스패닝트리 내에서 사이클을 이루면 배제·(|V|-1) 개의 간선을 선택
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
(e) 최소간선(2,5)선택 (f)(2,3)(0.3):사이클을 형성 간선(1,2)을선택 0 0 1 3 1 3 2 2 4 5 4 5
- 알고리즘T = ;Øwhile((T가 (n-1)보다 적은수의 간선을 포함) &&(E가 공백이아님)){ E로부터 가장 작은 비용을 갖는 간선 (v, w)를 선택; E로부터 간선 (v, w)를 제거; if((v, w)가 T내에서 사이클을 형성하지 않음) (v, w)를 T에 추가; else (v, w)를 버림; }
if (T내의 간선의 수가 (n-1)보다 작음) printf(" 스패닝 트리가 없다. n");- 알고리즘 분석 시간 복잡도 : 간선들을 정렬하는데 걸리는 시간 O(elog2e)(2) Prim 알고리즘- 임의의 단일 정점에서 시작하여 스패닝 트리 내에 있는 모든 정점들과 인접한 간선들 중에서 최소 비용을 가지며, 사이클을 형성하지 않는 간선을 선택- (|V|-1) 개의 간선이 선택
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
0 0 (f)(0,3)(2.3):사이클을 형성 간선 (e) 최소간선(1,4)선택(1,2)을 선택 1 3 1 3 2 2 4 5 4 5
for(T= ; T내의 간선의 수가 (n-1)보다 적음 ; (u, v)를 T에 추가) { (u ∈TV)이고 (v TV)인 조건을 만족하는 간선(u, v)중에서 최소 비용 간선을 선택; if(더 이상 그러한 간선이 없음) break; v를 TV에 추가; } if(T내의 간선의 수가 (n-1) 보다 적음) printf(" 스패닝 트리가 없다. n");
알고리즘 분석·매 단계에서 하나씩 정점을 선택하며, 모두 n개의 정점을 선택·시간 복잡도 : O(n2)5 절단점과 이중 연결 요소○ 문제 정의- 통신이나 수송 망에서 문제·한 정점과 그에 부속된 간선이 제거되었을 때 망이 분리되어 통신이 두절되는지 결정하는 문제- 절단점(articulation point 또는 cut vertex)