122
그래프 자바로 배우는 쉬운 자료구조

ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

그래프

자바로 배우는 쉬운 자료구조

Page 2: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

2

그래프의 구조1

그래프의 구현2

그래프 순회3

이 장에서 다룰 내용

신장 트리와 최소 비용 신장 트리4

최단 경로 탐색5

Page 3: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

3

그래프(graph)

선형 자료구조나 트리 자료구조로 표현하기 어려운 多:多의 관계를

가지는 원소들을 표현하기 위한 자료구조

그래프 G

• 객체를 나타내는 정점(vertex)과 객체를 연결하는 간선(edge)의 집합

• G = (V, E)

V는 그래프에 있는 정점들의 집합

E는 정점을 연결하는 간선들의 집합

그래프의 예

그래프 (1)

Page 4: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

4

1800년대 오일러에 의하여 창안

오일러 문제

모든 다리를 한번만 건너서 처음

출발했던 장소로 돌아오는 문제

문제의 핵심만을 표현

위치: 정점(node)

다리: 간선(edge)

오일러 경로: 정점에 연결된 간선의 개수가 짝수이면 존재

그래프 (2)

Page 5: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

5

그래프 예:

정점은 각 도시를 의미한다.

간선은 도시를 연결하는 도

로를 의미한다. 간선에는

도로의 길이등의 데이터가

저장될 수 있다.

그래프 (3)

Page 6: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

6

그래프의 종류

무방향 그래프(undirected graph)

• 두 정점을 연결하는 간선의 방향이 없는 그래프

• 정점 Vi와 정점 Vj을 연결하는 간선을 (Vi, Vj)로 표현

(Vi, Vj)와 (Vj, Vi)는 같은 간선을 나타낸다.

V(G1)={A, B, C, D} E(G1)={(A,B), (A,D), (B,C), (B,D), (C,D)}

V(G2)={A, B, C} E(G2)={(A,B), (A,C), (B,C)}

그래프 (4)

Page 7: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

7

방향 그래프(directed graph) , 다이그래프(digraph)

• 간선이 방향을 가지고 있는 그래프

• 정점 Vi에서 정점 Vj를 연결하는 간선 즉, Vi→Vj를 <Vi, Vj>로 표현

Vi를 꼬리(tail), Vj를 머리(head)라고 한다.

<Vi, Vj>와 <Vj, Vi>는 서로 다른 간선

V(G3)={A, B, C, D} E(G3)={<A,B>, <A,D>, <B,C>, <B,D>, <C,D>}

V(G4)={A, B, C} E(G4)={<A,B>, <A,C>, <B,A>, <B,C>}

그래프 (5)

Page 8: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

8

완전 그래프(complete graph)

• 각 정점에서 다른 모든 정점을 연결하여 최대의 간선 수를 가진 그래프

• 정점이 n개인 무방향 그래프에서 최대의 간선 수 : n(n-1)/2개

• 정점이 n개인 방향 그래프의 최대 간선 수 : n(n-1)개

• 완전 그래프의 예

G5는 정점의 개수가 4개인 무방향 그래프이므로 완전 그래프가 되려면4(4-1)/2=6개의 간선 연결

G6은 정점의 개수가 4개인 방향 그래프이므로 완전 그래프가 되려면4(4-1)=12개의 간선 연결

그래프 (6)

Page 9: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

9

부분 그래프(subgraph)

• 원래의 그래프에서 일부의 정점이나 간선을 제외하여 만든 그래프

• 그래프 G와 부분 그래프 G'의 관계

V(G')⊆V(G), E(G')⊆E(G)

• 그래프 G1에 대한 부분 그래프의 예

그래프 (7)

Page 10: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

10

가중 그래프(weight graph) , 네트워크(network)

• 정점을 연결하는 간선에 가중치(weight)를 할당한 그래프

그래프 (8)

Page 11: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

11

그래프 관련 용어

인접, 부속

• 그래프에서 두 정점 Vi과 Vj를 연결하는 간선 (Vi, Vj)가 있을 때, 두 정점

Vi와 Vj를 인접(adjacent)되어 있다고 표현

• 간선 (Vi, Vj)는 정점 Vi와 Vj에 부속(incident)되어 있다고 표현

• 그래프 G1에서 정점 A와 인접한 정점은 B와 D이고, 정점 A에 부속되어

있는 간선은 (A,B)와 (A,D)

차수(degree) – 정점에 부속되어 있는 간선의 수

• 그래프 G1에서 정점 A의 차수는 2, 정점 B의 차수는 3

• 방향 그래프의 정점의 차수 = 진입차수 + 진출차수

방향 그래프의 진입차수(in-degree) : 정점을 머리로 하는 간선의 수

방향 그래프의 진출차수(out-degree) : 정점을 꼬리로 하는 간선의 수

방향 그래프 G3에서 정점 B의 진입차수는 1, 진출차수는 2

정점 B의 전체 차수는 (진입차수 + 진출차수) 이므로 3이 된다.

그래프 (9)

Page 12: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

12

경로(path)

• 그래프에서 간선을 따라 갈 수 있는 길을 순서대로 나열한 것 즉, 정점 Vi

에서 Vj까지 간선으로 연결된 정점을 순서대로 나열한 리스트

그래프 G1에서 정점 A에서 정점 C까지는 A-B-C 경로와 A-B-D-C 경로, A-D-C 경로, 그리고 A-D-B-C 경로가 있다.

경로 길이(path length)

• 경로를 구성하는 간선의 수

단순 경로(simple path)

• 모두 다른 정점으로 구성된 경로

그래프 G1에서 정점 A에서 정점 C까지의 경로 A-B-C는 단순경로이고, 경로 A-B-D-A-B-C는 단순경로가 아니다.

그래프 (10)

Page 13: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

13

사이클(cycle)

• 단순경로 중에서 경로의 시작 정점과 마지막 정점이 같은 경로

그래프 G1에서 단순경로 A-B-C-D-A와 그래프 G4에서 단순경로 A-B-A는 사이클이 된다.

DAG(directed acyclic graph)

• 방향 그래프이면서 사이클이 없는 그래프

연결 그래프(connected graph)

• 서로 다른 모든 쌍의 정점들 사이에 경로가 있는 그래프 즉, 떨어져있는

정점이 없는 그래프

• 그래프에서 두 정점 Vi에서 Vj까지의 경로가 있으면 정점 Vi와 Vj가 연결(connected)되었다고 한다.

트리는 사이클이 없는 연결 그래프

그래프 (11)

Page 14: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

14

추상 자료형 그래프

그래프 (12)

[ADT 8-1]ADT Graph데이터 : 공백이아닌정점의집합과간선의집합연산 :

g∈Graph; u,v∈V;createGraph() ∷= create an empty Graph;

// 공백그래프의생성연산isEmpty(g) ∷= if (g have no vertex) then return true;

else return false;// 그래프 g가 정점이없는공백그래프인지를검사하는연산

insertVertex(g, v) ∷= insert vertex v into g;// 그래프 g에 정점 v를삽입하는연산

insertEdge(g, u, v) ∷= insert edge (u,v) into g;// 그래프 g에 간선 (u,v)를삽입하는연산

deleteVertex(g, v) ∷= delete vertex v and all edges incident on v from g;// 그래프 g에서 정점 v를삭제하고그에부속된모든간선을삭제하는연산

deleteEdge(g, u, v) ∷= delete edges (u,v) from g;// 그래프 g에서 간선 (u,v)를삭제하는연산

adjacent(g, v) ∷= return set of all vertices adjacent to v;// 정점 v에인접한모든정점을반환하는연산

End Graph

[ADT 10-1]

Page 15: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

15

인접 행렬(Adjacent Matrix)

행렬에 대한 2차원 배열을 사용하는 순차 자료구조 방법

그래프의 두 정점을 연결한 간선의 유무를 행렬로 저장

• n개의 정점을 가진 그래프 : n x n 정방행렬

• 행렬의 행번호와 열번호 : 그래프의 정점

• 행렬 값 : 두 정점이 인접되어있으면 1, 인접되어있지 않으면 0

무방향 그래프의 인접 행렬

• 행 i의 합 = 열 i의 합 = 정점 i의 차수

방향 그래프의 인접 행렬

• 행 i의 합 = 정점 i의 진출차수

• 열 i의 합 = 정점 i의 진입차수

그래프의 구현 (1)

Page 16: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

16

그래프의 구현 (2)

Page 17: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

17

인접 행렬 표현의 단점

• n개의 정점을 가지는 그래프를 항상 n x n개의 메모리 사용

• 메모리 낭비 문제 유발

무방향성 그래프에서 대칭형 행렬이 되어 데이터 중복 발생

정점의 개수에 비해서 간선의 개수가 적은 희소 그래프에 대한 인접 행렬은 희소 행렬이 되므로 메모리의 낭비 발생

그래프의 구현 (3)

Page 18: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

18

인접 리스트(Adjacent List)

각 정점에 대한 인접 정점들을 연결하여 만든 단순 연결 리스트

각 정점의 차수만큼 노드를 연결

• 리스트 내의 노드들은 인접 정점에 대해서 오름차순으로 연결

인접 리스트의 각 노드

• 정점을 저장하는 필드와 다음 인접 정점을 연결하는 링크 필드로 구성

정점의 헤드 노드

• 정점에 대한 리스트의 시작을 표현

그래프의 구현 (4)

Page 19: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

19

n개의 정점과 e개의 간선을 가진 무방향 그래프의 인접 리스트

• 헤드 노드 배열의 크기 : n

• 연결하는 노드의 수 : 2e

• 각 정점의 헤드에 연결된 노드의 수 : 정점의 차수

n개의 정점과 e개의 간선을 가진 방향 그래프의 인접 리스트

• 헤드 노드 배열의 크기 : n

• 연결하는 노드의 수 : e

• 각 정점의 헤드에 연결된 노드의 수 : 정점의 진출 차수

그래프의 구현 (5)

Page 20: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

20

그래프 G1, G2, G3, G4에 대한 인접 리스트

그래프의 구현 (6)

Page 21: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

21

그래프의 인접 행렬과 인접 리스트 표현

그래프의 구현 (7)

>> 계속

01 class AdjMatrix{02 private int matrix[][]=new int[10][10];03 private int totalV=0;0405 public void insertVertex(int v){06 totalV++;07 }0809 public void insertEdge(int v1, int v2){10 if(v1>=totalV || v2>=totalV)11 System.out.println("그래프에 없는정점입니다!!");12 else13 matrix[v1][v2] = 1;14 }1516 public void printMatrix(){17 for(int i=0; i<totalV; i++){

[예제 10-1]

Page 22: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

22

그래프의 구현 (8)

>> 계속

18 System.out.printf("\n\t\t");19 for(int j=0; j<totalV; j++)20 System.out.printf("%2d", matrix[i][j]);21 }22 }23 }2425 class GraphNode{26 int vertex;27 GraphNode link;28 }2930 class AdjList{31 private GraphNode head[] = new GraphNode[10];32 private int totalV=0;3334 public void insertVertex(int v){35 totalV++;

[예제 10-1]

Page 23: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

23

그래프의 구현 (9)

>> 계속

36 }3738 public void insertEdge(int v1, int v2){39 if(v1>=totalV || v2>=totalV)40 System.out.println("그래프에 없는정점입니다!!");41 else{42 GraphNode gNode = new GraphNode();43 gNode.vertex = v2;44 gNode.link = head[v1];45 head[v1] = gNode;46 }47 }4849 public void printAdjList(){50 GraphNode gNode = new GraphNode();51 for(int i=0; i<totalV; i++){52 System.out.printf("\n정점 %c의인접리스트 ", i+65);53 gNode = head[i];

[예제 10-1]

Page 24: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

24

그래프의 구현 (10)

>> 계속

54 while(gNode != null){55 System.out.printf("-> %c", gNode.vertex+65);56 gNode = gNode.link;57 }58 }59 }60 }6162 class Ex10_1{63 public static void main(String args[]){64 AdjMatrix MG1 = new AdjMatrix();65 for(int i=0; i<4; i++)66 MG1.insertVertex(i);67 MG1.insertEdge(0,3);68 MG1.insertEdge(0,1);69 MG1.insertEdge(1,3);70 MG1.insertEdge(1,2);71 MG1.insertEdge(1,0);

[예제 10-1]

Page 25: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

25

그래프의 구현 (11)

>> 계속

72 MG1.insertEdge(2,3);73 MG1.insertEdge(2,1);74 MG1.insertEdge(3,2);75 MG1.insertEdge(3,1);76 MG1.insertEdge(3,0);77 System.out.printf("\n그래프 G1의인접행렬 : ");78 MG1.printMatrix();79 System.out.println();8081 AdjList LG1 = new AdjList();82 for(int i=0; i<4; i++)83 LG1.insertVertex(i);84 LG1.insertEdge(0,3);85 LG1.insertEdge(0,1);86 LG1.insertEdge(1,3);87 LG1.insertEdge(1,2);88 LG1.insertEdge(1,0);89 LG1.insertEdge(2,3);

[예제 10-1]

Page 26: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

26

그래프의 구현 (12)

>> 계속

90 LG1.insertEdge(2,1);91 LG1.insertEdge(3,2);92 LG1.insertEdge(3,1);93 LG1.insertEdge(3,0);94 System.out.printf("\n그래프 G1의인접리스트 : ");95 LG1.printAdjList();96 System.out.println();97 }98 }

[예제 10-1]

Page 27: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

27

그래프의 구현 (13)

실행결과

Page 28: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

28

그래프 순회(Graph Traversal)

그래프 탐색(graph search) 연산

하나의 정점에서 시작하여 그래프에 있는 모든 정점을 한번씩 방문

하여 처리하는 연산

그래프 탐색방법

• 깊이 우선 탐색(Depth First Search : DFS)

• 너비 우선 탐색(Breadth First Search : BFS)

그래프 순회 (1)

Page 29: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

29

그래프 순회의 예) 우물 파기

• 한 지점을 골라서 팔 수 있을 때까지 계속해서 깊게 파다가 아무리 땅을

파도 물이 나오지 않으면, 밖으로 나와 다른 지점을 골라서 다시 깊게 땅

을 파는 방법 ( ☞ 깊이 우선 탐색 )

• 여러 지점을 고르게 파보고 물이 나오지 않으면, 파놓은 구덩이들을 다시좀더 깊게 파는 방법 ( ☞ 너비 우선 탐색 )

그래프 순회 (2)

Page 30: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

30

깊이 우선 탐색(Depth First Search : DFS)

순회 방법

① 시작 정점의 한 방향으로 갈 수 있는 경로가 있는 곳까지 깊이 탐색

② 더 이상 갈 곳이 없게 되면, 가장 마지막에 만났던 갈림길 간선이 있는정점으로 되돌아옴

③ 다른 방향의 간선으로 탐색을 계속 반복하여 결국 모든 정점을 방문

• 가장 마지막에 만났던 갈림길 간선의 정점으로 가장 먼저 되돌아가서

다시 깊이 우선 탐색을 반복해야 하므로 후입선출 구조의 스택 사용

그래프 순회 (3)

Page 31: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

31

깊이 우선 탐색의 수행 순서

그래프 순회 (4)

⑴ 시작 정점 v를 결정하여 방문한다.

⑵ 정점 v에 인접한 정점 중에서

① 방문하지 않은 정점 w가 있으면, 정점 v를 스택에 push하고 w를

방문한다. 그리고 w를 v로 하여 다시 ⑵를 반복한다.

② 방문하지 않은 정점이 없으면, 탐색의 방향을 바꾸기 위해서 스택

을 pop하여 받은 가장 마지막 방문 정점을 v로 하여 다시 ⑵를 수행

한다.

⑶ 스택이 공백이 될 때까지 ⑵를 반복한다.

Page 32: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

32

깊이 우선 탐색 알고리즘

그래프 순회 (5)

DFS(v)for (i←0; i<n; i←i+1) do {

visited[i]←false;}stack←createStack();visited[v]←true;while (not isEmpty(stack)) do {

if (visited[v의인접정점 w]=false) then {push(stack, v);visited[w]←true;w 방문;v←w;

}else v←pop(stack);

}end DFS()

[알고리즘 10-1]

Page 33: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

33

깊이 우선 탐색

예) 그래프 G9에 대한 깊이 우선 탐색

초기상태 : 배열 visited를 False로 초기화하고, 공백 스택을 생성

그래프 순회 (6)

Page 34: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

34

① 정점 A를 시작으로 깊이 우선 탐색을 시작

visited[A]←true;

A 방문;

그래프 순회 (7)

Page 35: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

35

② 정점 A에 방문하지 않은 정점 B, C가 있으므로 A를 스택에 push

하고, 인접정점 B와 C 중에서 오름차순에 따라 B를 선택하여 탐색

진행

push(stack, A);

visited[B]←true;

B 방문;

그래프 순회 (8)

Page 36: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

36

③ 정점 B에 방문하지 않은 정점 D, E가 있으므로 B를 스택에 push

하고, 인접정점 D와 E 중에서 오름차순에 따라 D를 선택하여 탐색

을 계속한다.

push(stack, B);

visited[D]←true;

D 방문;

그래프 순회 (9)

Page 37: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

37

④ 정점 D에 방문하지 않은 정점 G가 있으므로 D를 스택에 push 하

고, 인접정점 G를 선택하여 탐색을 계속한다.

push(stack, D);

visited[G]←true;

G 방문;

그래프 순회 (10)

Page 38: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

38

⑤ 정점 G에 방문하지 않은 정점 E, F가 있으므로 G를 스택에 push

하고, 인접정점 E와 F 중에서 오름차순에 따라 E를 선택하여 탐색

을 계속한다.

push(stack, G);

visited[E]←true;

E 방문;

그래프 순회 (11)

Page 39: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

39

⑥ 정점 E에 방문하지 않은 정점 C가 있으므로 E를 스택에 push 하고,

인접정점 C를 선택하여 탐색을 계속한다.

push(stack, E);

visited[C]←true;

C 방문;

그래프 순회 (12)

Page 40: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

40

⑦ 정점 C에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로

돌아가기 위해 스택을 pop 하여 받은 정점 E에 대해서 방문하지 않

은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (13)

Page 41: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

41

⑧ 정점 E는 방문하지 않은 인접정점이 없으므로, 다시 스택을 pop 하

여 받은 정점 G에 대해서 방문하지 않은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (14)

Page 42: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

42

⑨ 정점 G에 방문하지 않은 정점 F가 있으므로 G를 스택에 push 하

고, 인접정점 F를 선택하여 탐색을 계속한다.

push(stack, G);

visited[F]←true;

F 방문;

그래프 순회 (15)

Page 43: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

43

⑩ 정점 F에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로

돌아가기 위해 스택을 pop 하여 받은 정점 G에 대해서 방문하지 않

은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (16)

Page 44: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

44

⑪ 정점 G에서 방문하지 않은 인접정점이 없으므로, 다시 마지막 정점

으로 돌아가기 위해 스택을 pop 하여 받은 정점 D에 대해서 방문하

지 않은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (17)

Page 45: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

45

⑫ 정점 D에서 방문하지 않은 인접정점이 없으므로, 다시 마지막 정점

으로 돌아가기 위해 스택을 pop 하여 받은 정점 B에 대해서 방문하

지 않은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (18)

Page 46: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

46

⑬ 정점 B에서 방문하지 않은 인접정점이 없으므로, 다시 마지막 정점

으로 돌아가기 위해 스택을 pop 하여 받은 정점 A에 대해서 방문하

지 않은 인접정점이 있는지 확인한다.

pop(stack);

그래프 순회 (19)

Page 47: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

47

⑭ 정점 A에서 방문하지 않은 인접정점이 없으므로, 마지막 정점으로

돌아가기 위해 스택을 pop 하는데 스택이 공백이므로 깊이 우선 탐

색을 종료한다.

그래프 G9의 깊이 우선 탐색 경로 : A-B-D-G-E-C-F

그래프 순회 (20)

Page 48: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

48

너비 우선 탐색(Breadth First Search : BFS)

순회 방법

• 시작 정점으로부터 인접한 정점들을 모두 차례로 방문하고 나서, 방문했

던 정점을 시작으로 하여 다시 인접한 정점들을 차례로 방문하는 방식

• 가까운 정점들을 먼저 방문하고 멀리 있는 정점들은 나중에 방문하는

순회방법

• 인접한 정점들에 대해서 차례로 다시 너비 우선 탐색을 반복해야 하므로

선입선출의 구조를 갖는 큐를 사용

그래프 순회 (21)

Page 49: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

49

너비 우선 탐색의 수행 순서

그래프 순회 (22)

⑴ 시작 정점 v를 결정하여 방문한다.

⑵ 정점 v에 인접한 정점들 중에서 방문하지 않은 정점을 차례로 방문

하면서 큐에 enQueue한다.

⑶ 방문하지 않은 인접한 정점이 없으면, 방문했던 정점에서 인접한 정

점들을 다시 차례로 방문하기 위해서 큐에서 deQueue하여 구한 정

점에서 ⑵를 반복한다.

⑷ 큐가 공백이 될 때까지 ⑵~⑶을 반복한다.

Page 50: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

50

너비 우선 탐색 알고리즘

그래프 순회 (23)

BFS(v)for (i←0; i<n; i←i+1) do {

visited[i]←false;}Q←createQueue();visited[v]←true;v 방문;while (not isEmpty(Q)) do {

while (visited[v의인접정점 w]=false) do {visited[w]←true;w 방문;enQueue(Q, w);

}v←deQueue(Q);

}end BFS()

[알고리즘 10-2]

Page 51: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

51

너비 우선 탐색

예) 그래프 G9에 대한 너비 우선 탐색

초기상태 : 배열 visited를 False로 초기화하고, 공백 큐를 생성

그래프 순회 (24)

Page 52: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

52

① 정점 A를 시작으로 너비 우선 탐색을 시작한다.

visited[A]←true;

A 방문;

그래프 순회 (25)

Page 53: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

53

② 정점 A의 방문 안한 모든 인접정점 B, C를 방문하고, 큐에

enQueue 한다.

visited[(A의 방문 안한 인접정점 B와 C)]←true;

(A의 방문 안한 인접정점 B와 C) 방문;

enQueue(Q, (A의 방문 안한 인접정점 B와 C));

그래프 순회 (26)

Page 54: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

54

③ 정점 A에 대한 인접정점들을 처리했으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 B를 구한다.

v ← deQueue(Q);

그래프 순회 (27)

Page 55: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

55

④ 정점 B의 방문 안한 모든 인접정점 D, E를 방문하고 큐에

enQueue 한다.

visited[(B의 방문 안한 인접정점 D와 E)]←true;

(B의 방문 안한 인접정점 D와 E) 방문;

enQueue(Q, (B의 방문 안한 인접정점 D와 E));

그래프 순회 (28)

Page 56: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

56

⑤ 정점 B에 대한 인접정점들을 처리했으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 C를 구한다.

v ← deQueue(Q);

그래프 순회 (29)

Page 57: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

57

⑥ 정점 C에는 방문 안한 인접정점이 없으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 D를 구한다.

v ← deQueue(Q);

그래프 순회 (29)

Page 58: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

58

⑦ 정점 D의 방문 안한 인접정점 G를 방문하고 큐에 enQueue 한다.

visited[(D의 방문 안한 인접정점 G)]←true;

(D의 방문 안한 인접정점 G) 방문;

enQueue(Q, (D의 방문 안한 인접정점 G));

그래프 순회 (30)

Page 59: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

59

⑧ 정점 D에 대한 인접정점들을 처리했으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 E를 구한다.

v ← deQueue(Q);

그래프 순회 (31)

Page 60: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

60

⑨ 정점 E에는 방문 안한 인접정점이 없으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 G를 구한다.

v ← deQueue(Q);

그래프 순회 (32)

Page 61: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

61

⑩ 정점 G의 방문 안한 인접정점 F를 방문하고 큐에 enQueue 한다.

visited[(G의 방문 안한 인접정점 F)]←true;

(G의 방문 안한 인접정점 F) 방문;

enQueue(Q, (G의 방문 안한 인접정점 F));

그래프 순회 (33)

Page 62: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

62

⑪ 정점 G에 대한 인접정점들을 처리했으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하여 정점 F를 구한다 .

v ← deQueue(Q);

그래프 순회 (34)

Page 63: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

63

⑫ 정점 F에는 방문 안한 인접정점이 없으므로, 너비 우선 탐색을 계속

할 다음 정점을 찾기 위해 큐를 deQueue하는데 큐가 공백이므로

너비 우선 탐색을 종료한다 .

그래프 G9의 너비 우선 탐색 경로 : A-B-C-D-E-G-F

그래프 순회 (35)

Page 64: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

64

그래프 G9를 너비 우선 탐색하는 프로그램

그래프 G9를 인접 리스트로 표현한다.

정점 A~G 대신에 0~6의 번호를 사용하여 연산하고, 출력할 때에는

A~G 문자로 바꾸어 표시한다.

너비 우선 탐색을 위해서 7장에서 구현한 큐 프로그램을 사용한다.

실행 결과 >

그래프 순회 (36)

Page 65: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

65

인접 리스트로 표현한 그래프의 깊이 우선 탐색과 너비 우선 탐색

그래프 순회 (37)

>> 계속

001 class StackNode{002 int data;003 StackNode link;004 }005006 class LinkedStack{007 StackNode top;008009 public boolean isEmpty(){010 return (top == null);011 }012013 public void push(int item){014 StackNode newNode = new StackNode();015 newNode.data = item;016 newNode.link = top;017 top = newNode;

[예제 10-2]

Page 66: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

66

그래프 순회 (38)

>> 계속

018 }019020 public int pop(){021 if(isEmpty()) {022 System.out.println("Deleting fail! Linked Stack is empty!!");023 return 0;024 }025 else{026 int item = top.data;027 top = top.link;028 return item;029 }030 }031 }032033 class QNode{034 int data;035 QNode link;

[예제 10-2]

Page 67: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

67

그래프 순회 (39)

>> 계속

036 }037038 class LinkedQueue{039 QNode front;040 QNode rear;041042 public LinkedQueue(){043 front = null;044 rear = null;045 }046047 public boolean isEmpty(){048 return (front == null);049 }050051 public void enQueue(int item){052 QNode newNode = new QNode();053 newNode.data = item;

[예제 10-2]

Page 68: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

68

그래프 순회 (40)

>> 계속

054 newNode.link = null;055 if(isEmpty()){056 front = newNode;057 rear = newNode;058 }059 else {060 rear.link = newNode;061 rear = newNode;062 }063 }064065 public int deQueue(){066 if(isEmpty()) {067 System.out.println("Deleting fail! Linked Queue is empty!!");068 return 0;069 }070 else{071 int item = front.data;

[예제 10-2]

Page 69: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

69

그래프 순회 (41)

>> 계속

072 front = front.link;073 if(front == null)074 rear = null;075 return item;076 }077 }078 }079080 class GraphNode{081 int vertex;082 GraphNode link;083 }084085 class AdjList{086 GraphNode head[] = new GraphNode[10];087 private int totalV=0;088089 public void insertVertex(int v){

[예제 10-2]

Page 70: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

70

그래프 순회 (42)

>> 계속

090 totalV++;091 }092093 public void insertEdge(int v1, int v2){094 if(v1>=totalV || v2>=totalV)095 System.out.println("그래프에 없는정점입니다!!");096 else{097 GraphNode gNode = new GraphNode();098 gNode.vertex = v2;099 gNode.link = head[v1];100 head[v1] = gNode;101 }102 }103104 public void printAdjList(){105 GraphNode gNode = new GraphNode();106 for(int i=0; i<totalV; i++){107 System.out.printf("\n정점 %c의인접리스트 ", i+65);

[예제 10-2]

Page 71: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

71

그래프 순회 (43)

>> 계속

108 gNode = head[i];109 while(gNode != null){110 System.out.printf("-> %c", gNode.vertex+65);111 gNode = gNode.link;112 }113 }114 }115116 public void DFS(int v){117 GraphNode w = new GraphNode();118 LinkedStack S = new LinkedStack();;119 boolean visited[] = new boolean[10];120 S.push(v);121 visited[v] = true;122 System.out.printf(" %c", v+65);123 while(S.top != null){124 w = head[v];125 while(w != null){

[예제 10-2]

Page 72: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

72

그래프 순회 (44)

>> 계속

126 if(visited[w.vertex]==false){127 S.push(w.vertex);128 visited[w.vertex]=true;129 System.out.printf(" %c", w.vertex+65);130 v = w.vertex;131 w = head[v];132 }133 else w = w.link;134 }135 v = S.pop();136 }137 }138139 public void BFS(int v){140 GraphNode w = new GraphNode();141 LinkedQueue Q = new LinkedQueue();142 boolean visited[] = new boolean[10];143 visited[v] = true;

[예제 10-2]

Page 73: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

73

그래프 순회 (45)

>> 계속

144 System.out.printf(" %c", v+65);145 Q.enQueue(v);146 while(! Q.isEmpty()){147 v = Q.deQueue();148 for(w=head[v]; w != null; w=w.link){149 if(visited[w.vertex] == false){150 visited[w.vertex] = true;151 System.out.printf(" %c", w.vertex+65);152 Q.enQueue(w.vertex);153 }154 }155 }156 }157 }158159 class Ex10_2{160 public static void main(String args[]){161 AdjList G9 = new AdjList();

[예제 10-2]

Page 74: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

74

그래프 순회 (46)

>> 계속

162163 for(int i=0; i<7; i++)164 G9.insertVertex(i);165 G9.insertEdge(0,2);166 G9.insertEdge(0,1);167 G9.insertEdge(1,4);168 G9.insertEdge(1,3);169170 G9.insertEdge(2,4);171 G9.insertEdge(2,0);172 G9.insertEdge(3,6);173 G9.insertEdge(3,1);174 G9.insertEdge(4,6);175 G9.insertEdge(4,2);176 G9.insertEdge(4,1);177 G9.insertEdge(5,6);178 G9.insertEdge(6,5);179 G9.insertEdge(6,4);

[예제 10-2]

Page 75: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

75

그래프 순회 (47)

>> 계속

180 G9.insertEdge(6,3);181 System.out.printf("\n 그래프 G9의인접리스트 :");182 G9.printAdjList(); System.out.println();183184 System.out.printf("\n\n 깊이우선탐색 >> ");185 G9.DFS(0);186187 System.out.printf("\n\n 너비우선탐색 >> ");188 G9.BFS(0);189 }190 }

[예제 10-2]

Page 76: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

76

그래프 순회 (48)

실행결과

Page 77: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

77

신장 트리(Spanning Tree)

n개의 정점으로 이루어진 무방향 그래프 G에서 n개의 모든 정점과

n-1개의 간선으로 만들어진 트리

신장 트리에서는 사이클이 포함하면 안됨

최소 개수의 간선을 이용하여 네트워크 구성

그래프 G1과 신장 트리의 예

신장 트리 (1)

Page 78: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

78

깊이 우선 신장 트리(Depth First Spanning Tree)

• 깊이 우선 탐색을 이용하여 생성된 신장 트리

너비 우선 신장 트리(Breadth First Spanning Tree)

• 너비 우선 탐색을 이용하여 생성된 신장 트리

그래프 G1의 깊이 우선 신장 트리와 너비 우선 신장 트리

신장 트리 (2)

Page 79: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

79

최소 비용 신장 트리(Minimum Cost Spanning Tree)

무방향 가중치 그래프에서 신장 트리를 구성하는 간선들의 가중치 합

이 최소인 신장 트리

• 가중치 - 그래프의 간선에 주어진 가중치

비용이나 거리, 시간을 의미하는 값

응용 예:• 도로 건설 - 도시들을 모두 연결하면서 도로의 길이가 최소가 되도록 하는

문제

• 전기 회로 - 단자들을 모두 연결하면서 전선의 길이가 가장 최소가 되도록하는 문제

• 통신 - 전화선의 길이가 최소가 되도록 전화 케이블 망을 구성하는 문제

• 배관 - 파이프를 모두 연결하면서 파이프의 총 길이가 최소가 되도록 연결하는 문제

최소 비용 신장 트리 (1)

Page 80: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

80

최소 비용 신장 트리 구성 알고리즘

Kruskal의 알고리즘

Prime의 알고리즘

탐욕적인 방법(Greedy Method) 알고리즘 설계에서 있어서 중요한 기법 중의 하나

결정을 해야 할 때마다 그 순간에 가장 좋다고 생각되는 것을 해답으

로 선택함으로써 최종적인 해답에 도달

탐욕적인 방법은 항상 최적의 해답을 주는지를 반드시 검증해야 함

Kruskal 알고리즘은 최적의 해답을 주는 것으로 증명

최소 비용 신장 트리 (2)

Page 81: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

81

Kruskal 알고리즘Ⅰ

• 가중치가 높은 간선을 제거하면서 최소 비용 신장 트리를 만드는 방법

• Kruskal 알고리즘Ⅰ

최소 비용 신장 트리 (3)

⑴ 그래프 G의 모든 간선을 가중치에 따라 내림차순으로 정리한다.

⑵ 그래프 G에서 가중치가 가장 높은 간선을 제거한다.

이때 정점을 그래프에서 분리시키는 간선은 제거할 수 없으므로

이런 경우에는 그 다음으로 가중치가 높은 간선을 제거한다.

⑶ 그래프 G에 n-1개의 간선만 남을 때까지 ⑵를 반복한다.

⑷ 그래프에 n-1개의 간선이 남게 되면 최소 비용 신장 트리가 완성된다.

Page 82: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

82

Kruskal 알고리즘Ⅰ을 이용, G10의 최소비용 신장 트리 만들기

• 초기 상태 : 그래프 G10의 간선을 가중치에 따라서 내림차순 정렬

최소 비용 신장 트리 (4)

Page 83: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

83

① 가중치가 가장 큰 간선 (A,C) 제거. (현재 남은 간선의 수 : 10개)

최소 비용 신장 트리 (5)

Page 84: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

84

② 남은 간선 중에서 가중치가 가장 큰 간선 (F,G) 제거.

(현재 남은 간선의 수 : 9개)

최소 비용 신장 트리 (6)

Page 85: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

85

③ 남은 간선 중에서 가중치가 가장 큰 간선 (B,G) 제거.

(현재 남은 간선의 수 : 8개)

최소 비용 신장 트리 (7)

Page 86: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

86

④ 남은 간선 중에서 가중치가 가장 큰 간선 (C,E) 제거.

(현재 남은 간선의 수 : 7개)

최소 비용 신장 트리 (8)

Page 87: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

87

⑤ 남은 간선 중에서 가중치가 가장 큰 간선 (D,E)를 제거하면, 그래프

가 분리되어 단절 그래프가 되므로, 그 다음으로 가중치가 큰 간선

(C,F)를 제거해야 한다. 그런데 간선 (C,F)를 제거하면 정점 C가

분리되므로 제거할 수 없으므로, 다시 그 다음으로 가중치가 큰 간선

(A,D)를 제거한다. (현재 남은 간선의 수 : 6개)

최소 비용 신장 트리 (9)

Page 88: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

88

⑥ 현재 남은 간선의 수가 6개 이므로 알고리즘 수행을 종료하고 신장

트리 완성.

G10의 최소 비용 신장 트리

최소 비용 신장 트리 (10)

Page 89: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

89

Kruskal 알고리즘Ⅱ 가중치가 낮은 간선을 삽입하면서 최소 비용 신장 트리를 만드는 방법

Kruskal 알고리즘Ⅱ

최소 비용 신장 트리 (11)

⑴ 그래프 G의 모든 간선을 가중치에 따라 오름차순으로 정리한다.

⑵ 그래프 G에 가중치가 가장 작은 간선을 삽입한다.

이때 사이클을 형성하는 간선은 삽입할 수 없으므로

이런 경우에는 그 다음으로 가중치가 작은 간선을 삽입한다.

⑶ 그래프 G에 n-1개의 간선을 삽입할 때까지 ⑵를 반복한다.

⑷ 그래프 G의 간선이 n-1개가 되면 최소 비용 신장 트리가 완성된다.

Page 90: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

90

최소 비용 신장 트리가최소 비용의 간선으로구성됨과 동시에 사이클을 포함하지 않는다는조건에 근거하여, 각 단계에서 사이클을 이루지않는 최소 비용 간선을선택

그래프의 간선들을 가중치의 오름차순으로 정렬한다.

정렬된 간선들의 리스트에서 사이클을 형성하지않는 간선을 찾아서 현재의 최소 비용 신장 트리의 집합에 추가한다.

만약 사이클을 형성하면그 간선은 제외된다.

최소 비용 신장 트리 (12)

Page 91: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

91

union-find 알고리즘

집합들의 합집합을 구하고 집합의 원소가 어떤 집합에 속하는지를

계산하는 알고리즘

여러가지 방법으로 구현이 가능하다

Kruskal 알고리즘에서 사이클 검사에 사용된다.

a와 b가 같은 집합에 속함 a와 b가 다른 집합에 속함

최소 비용 신장 트리 (13)

Page 92: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

92

Kruskal 알고리즘 Ⅱ를 이용, G10의 최소 비용 신장 트리 만들기

• 초기 상태 : 그래프 G10의 간선을 가중치에 따라서 오름차순 정렬

최소 비용 신장 트리 (14)

Page 93: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

93

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

최소 비용 신장 트리 (15)

Page 94: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

94

② 나머지 간선 중에서 가중치가 가장 작은 간선 (A,B) 삽입.

(현재 삽입한 간선의 수 : 2개)

최소 비용 신장 트리 (16)

Page 95: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

95

③ 나머지 간선 중에서 가중치가 가장 작은 간선 (E,F) 삽입.

(현재 삽입한 간선의 수 : 3개)

최소 비용 신장 트리 (17)

Page 96: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

96

④ 나머지 간선 중에서 가중치가 가장 작은 간선 (B,D) 삽입.

(현재 삽입한 간선의 수 : 4개)

최소 비용 신장 트리 (18)

Page 97: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

97

⑤ 나머지 간선 중에서 가중치가 가장 작은 간선 (A,D)를 삽입하면

A-B-D의 사이클이 생성되므로 삽입할 수 없다. 그 다음으로 가중

치가 가장 작은 간선 (C,F) 삽입. (현재 삽입한 간선의 수 : 5개)

최소 비용 신장 트리 (19)

Page 98: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

98

⑥ 나머지 간선 중에서 가중치가 가장 작은 간선 (D,E) 삽입.

(현재 삽입한 간선의 수 : 6개)

• 현재 삽입한 간선의 수가 6개 이므로 알고리즘 수행을 종료하고 신장 트

리 완성.

최소 비용 신장 트리 (20)

Page 99: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

99

G10의 최소 비용 신장 트리

최소 비용 신장 트리 (21)

Page 100: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

100

Prime 알고리즘

간선을 정렬하지 않고 하나의 정점에서 시작하여 트리를 확장해 나가

는 방법

최소 비용 신장 트리 (22)

⑴ 그래프 G에서 시작 정점을 선택한다.

⑵ 선택한 정점에 부속된 모든 간선 중에서 가중치가 가장 작은 간선을 연

결하여 트리를 확장한다.

⑶ 이전에 선택한 정점과 새로 확장된 정점에 부속된 모든 간선 중에서 가

중치가 가장 작은 간선을 삽입한다.

이때 사이클을 형성하는 간선은 삽입할 수 없으므로

그 다음으로 가중치가 작은 간선을 선택한다.

⑷ 그래프 G에 n-1개의 간선을 삽입할 때까지 ⑶을 반복한다.

⑸ 그래프 G의 간선이 n-1개가 되면 최소 비용 신장 트리가 완성된다.

Page 101: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

101

간선 (a, b)와 간선 (f, e)의가중치를 비교해보면 (f, e)가 27로서 (a, b)의

29보다 높다. 따라서 (f, e) 간선이 선택되고 정점 e가신장 트리 집합에 포함된다.

최소 비용 신장 트리 (23)

Page 102: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

102

최소 비용 신장 트리 (24)

Page 103: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

103

Prime 알고리즘을 이용하여 G10의 최소 비용 신장 트리 만들기

• 초기 상태 : 그래프 G10의 정점 중 정점 A를 시작 정점으로 선택

최소 비용 신장 트리 (25)

Page 104: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

104

① 정점 A에 부속된 간선 중에서 가중치가 가장 작은 간선 (A,B)을 삽

입하여 트리 확장. (현재 삽입한 간선의 수 : 1개)

최소 비용 신장 트리 (26)

Page 105: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

105

② 현재 확장된 트리의 정점 A, B에 부속된 간선 중에서 가중치가 가장

작은 간선 (B,D)를 삽입하여 트리 확장. (현재 삽입한 간선의 수 : 2)

최소 비용 신장 트리 (27)

Page 106: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

106

③ 현재 확장된 트리의 정점 A, B, D에 부속된 간선 중에서 가중치가

가장 작은 간선 (A,D)를 삽입하면 A-B-D의 사이클이 생성되므로

삽입할 수 없다. 따라서 그 다음으로 가중치가 가장 작은 간선 (D,E)

삽입. (현재 삽입한 간선의 수 : 3개, 삽입 불가능한 간선 : (A,D))

최소 비용 신장 트리 (28)

Page 107: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

107

④ 현재 확장된 트리의 정점 A, B, D, E에 부속된 간선 중에서 가중치

가 가장 작은 간선 (E,G)를 삽입하여 트리 확장.

(현재 삽입한 간선의 수 : 4개, 삽입 불가능한 간선 : (A,D))

최소 비용 신장 트리 (29)

Page 108: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

108

⑤ 현재 확장된 트리의 정점 A, B, D, E, G에 부속된 간선 중에서 가

중치가 가장 작은 간선 (E,F)를 삽입하여 트리 확장.

(현재 삽입한 간선의 수 : 5개, 삽입 불가능한 간선 : (A,D))

최소 비용 신장 트리 (30)

Page 109: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

109

⑥ 현재 확장된 트리의 정점 A, B, D, E, F, G에 부속된 간선 중에서

가중치가 가장 작은 간선 (C,F)를 삽입하여 트리 확장.

(현재 삽입한 간선의 수 : 6개, 삽입 불가능한 간선 : (A,D))

• 현재 남은 간선의 수가 6개 이므로 알고리즘 수행을 종료하고 신장 트리

완성.

최소 비용 신장 트리 (31)

Page 110: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

110

G10의 최소 비용 신장 트리

최소 비용 신장 트리 (32)

Page 111: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

111

최단 경로(shortest path) 문제

네트워크에서 정점 i와 정점 j를 연결하는 경로 중에서 간선들의 가

중치 합이 최소가 되는 경로를 찾는 문제

간선의 가중치는 비용, 거리, 시간 등을 나타낸다.

최단 경로 문제

Page 112: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

112

Dijkstra 최단 경로 알고리즘

네트워크에서 하나의 시작 정점으로부터 모든 다른 정점까지의 최단

경로를 찾는 알고리즘

집합 S: 시작 정점 v로부터의 최단경로가 이미 발견된 정점들의 집합

distance 배열: 최단 경로를 알려진 정점만을 통하여 각 정점까지 가

는 최단경로의 길이

매 단계에서 가장 distance 값이 적은 정점을 S에 추가한다.

Dijkstra 최단 경로 알고리즘 (1)

Page 113: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

113

Dijkstra 최단 경로 알고리즘

매단계에서 새로운 정점이 S에 추가되면 distance값을 갱신한다.

Dijkstra 최단 경로 알고리즘 (2)

Page 114: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

114

// 입력: 가중치 그래프 G, 가중치는 음수가 아님.

// 출력: distance 배열, distance[u]는 v에서 u까지의 최단 거리이다.

shortest_path(G, v)

S←{v}

for 각 정점 w∈G do

distance[w]←weight[v][w];

while 모든 정점이 S에 포함되지 않으면 do

u←집합 S에 속하지 않는 정점 중에서 최소 distance 정점;

S←S∪{u}

for u에 인접하고 S에 있는 각 정점 z do

if distance[u]+weight[u][z] < distance[z]

then distance[z]←distance[u]+weight[u][z];

Dijkstra 최단 경로 알고리즘 (3)

Page 115: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

115

Dijkstra 최단 경로 알고리즘 (4)

Page 116: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

116

Dijkstra 최단 경로 알고리즘 (5)

Page 117: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

117

Floyd의 최단 경로 알고리즘

그래프에 존재하는 모든 정점 사이의 최단 경로를 한번에 모두 찾아

주는 알고리즘

2차원 배열 A를 이용하여 3중 반복을 하는 루프로 구성

• Ak[i][j]를 0부터 k까지의 정점만을 이용한 정점 i에서 j까지의 최단 경로라고 하자.

• 우리가 원하는 답은 An-1[i][j]가 된다.

• A-1→A0 → A1 → … → An-1순으로 최단 거리를 구한다.

floyd(G)

for k ← 0 to n - 1

for i ← 0 to n - 1

for j ← 0 to n - 1

A[i][j] = min(A[i][j], A[i][k] + A[k][j])

Floyd 최단 경로 알고리즘 (1)

Page 118: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

118

먼저 Ak-1까지는 완벽한 최단 거리가 구해져서 있다고 가정하고, 일반적으로 k번째 정점이 추가로 고려되는 상황을 생각하여 보자.

0부터 k까지의 정점만을 사용하여 정점 i에서 정점 j로 가는 최단 경로는다음의 2가지의 경우로 나누어서 생각할 수 있다.

(1) 정점 k를 거쳐서 가지 않는 경우:

k보다 큰 정점은 통과하지 않으므로 최단 거리는 Ak-1[i][j]가 된다.

(2) 정점 k를 통과하는 경우:

i에서 k까지의 최단거리 Ak-1[i][k]에다가 k에서 j까지의 최단거리인

Ak-1[k][j]를 더한 값이 될 것이다.

Floyd 최단 경로 알고리즘 (2)

Page 119: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

119

위상정렬(topological sort) 방향 그래프에서 간선 <u, v>가 있다면 정점 u는 정점 v를 선행

한다고 말한다.

방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으

면서 모든 정점을 나열하는 것을 방향 그래프의 위상 정렬

(topological sort)이라고 한다.

과목번호 과목명 선수과목

0 전산학개론 없음

1 이산수학 없음

2 자료구조 1

3 알고리즘 분석 0, 1, 2

4 운영체제 1

5 인공지능 2, 3, 4

위상정렬: (0,1,2,3,4,5) , (1,0,2,3,4,5)

(2,0,1,3,4,5)는 위상 정렬이 아니다. 왜냐하면 2번 정점이 0번 정점 앞에 오기때문이다. 간선 <0, 2>이 존재하기 때문에 0번 정점이 끝나야 만이 2번 정점을시작할 수 있다.

위상 정렬 (1)

Page 120: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

120

위상 정렬 (2)

Page 121: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

121

Input: 그래프 G=(V,E)

Output: 위상 정렬 순서

topo_sort(G)

for i←0 to do

if( 모든 정점이 선행 정점을 가지면 )

then 사이클이 존재하고 위상 정렬 불가;

선행 정점을 가지지 않는 정점 v 선택;

v를 출력;

v와 v에서 나온 모든 간선들을 그래프에서 삭제;

위상 정렬 (3)

Page 122: ch10 그래프 [호환 모드] - silla.ac.krmclab.silla.ac.kr/lecture/201401/ds/ds_lecture_08.pdf · 2014-05-18 · 3 그래프(graph) 선형 자료구조나 트리 자료구조로

자바로 배우는 쉬운 자료구조