• 검색 결과가 없습니다.

8.1 그래프의 개요

N/A
N/A
Protected

Academic year: 2022

Share "8.1 그래프의 개요"

Copied!
131
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
(21)
(22)
(23)
(24)
(25)
(26)
(27)
(28)
(29)
(30)
(31)
(32)
(33)
(34)
(35)
(36)
(37)
(38)
(39)
(40)
(41)
(42)
(43)
(44)
(45)
(46)
(47)
(48)
(49)
(50)
(51)
(52)
(53)
(54)
(55)
(56)
(57)
(58)
(59)
(60)
(61)
(62)
(63)
(64)
(65)
(66)
(67)
(68)
(69)
(70)
(71)
(72)
(73)
(74)
(75)
(76)
(77)
(78)
(79)
(80)
(81)
(82)
(83)
(84)
(85)
(86)
(87)
(88)
(89)

8.1 그래프의 개요

8.1.1 그래프의 기본 개념

• 그래프(graph): 연결되어 있는 객체간의 관계를 표현하는 자료구조

• 그래프의 예: 전기회로, 프로젝트관리, 지도에서 도시들의 연결

• 그래프: 아주 일반적인 자료구조

• (예) 트리도 그래프의 일종으로 볼수 있다.

• 그래프 이론(graph theory): 그래프를 문제해결의 도구로

이용하는 연구분야

(90)

8.1.1 그래프의 기본 개념 (1)

• 1736년에 오일러에 의하 여 창안

• 오일러 문제: 모든 다리를 한번만 건너서 처음 출발 했던 장소로 돌아오는 문 제

• 문제의 핵심만을 표현

• 위치: 정점(node)

• 다리: 간선(edge)

• 오일러 경로: 정점에 연결

된 간선의 개수가 짝수이

면 존재

(91)

8.1.1 그래프의 기본 개념 (2)

• 그래프는 G(V, E)로 표시된다.

• V는 정점(vertices)들의 집합

• E는 간선(edge)들의 집합

• 정점과 간선은 모두 관련되는 데이터를 가질수 있다.

8.2: 그래프의 예

1

2 3

4

1

2 3

4 5 6

1 2 3

(a) G1 (b) G2 (c) G3

V(G1)={1, 2, 3, 4} E(G1)={(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3.,4)}

V(G2)={1, 2, 3, 4, 5, 6} E(G2)={(1, 2), (1, 3), (2, 4), (2, 5), (3, 6)}

V(G3)={1, 2, 3, 4} E(G3)={<1, 2>, <2, 3>, <3, 2>, <2, 4>}

4

(92)

8.1.2 그래프 관련 용어 (1)

• 완전 그래프(complete graph)

• 최대 수의 간선을 가진 그래프

• 정점이 n개일 때, 간선의 수는

• 무방향 그래프일 때 n(n-1)/2,

• 방향 그래프일 때 n(n-1)

• 다중 그래프(mutigraph)

• 두 정점사이 2개 이상의 간선이 존재하는 그래프

• 원칙적으로 그래프는 중복간선을 허용하지 않음

• 서브 그래프(subgraph)

• V(G’)⊆V(G)이고, E(G’)⊆E(G)인 그래프 G’를 그래프 G의 서브 그래프 또는 부분 그래프라 한다.

(93)

8.1.2 그래프 관련 용어 (2)

• 인접 (adjacent)과 부속 (incident):

무방향 그래프의 한 간선 (v

j

, v

k

)에 대해

• vj와 vk는 서로 인접한다.

• 간선 (vj, vk)는 정점 vj와 vk에 부속한다.

• 예1) 그래프 G1

• 정점 1, 3 : 정점 0에 인접.

• 간선 (0, 1), (1, 2), (1, 3) : 정점 1에 부속.

• 예2) 그래프 G2

• 정점 1 : 정점 2로 인접(adjacent to 2)

• 정점 2 : 정점 1로부터 인접(adjacent to 1)

• 아크 <0, 1>, <1, 2>, <1, 0> : 정점 1에 부속.

0 1

3 2

G1

0 1 2

G2

(94)

8.1.2 그래프 관련 용어 (3)

• 경로(path)와 사이클(cycle)

• 경로: 정점 vj 로부터 vi 까지의 경로(path)

• 경로의 길이(path length): 경로를 구성하는 간선의 수

• 단순 경로(simple path): 모두 상이한 간선들로 구 성된 경로

• 사이클(cycle): 첫 번째 정점과 마지막 정점이 동일 한 단순 경로

• 그래프 G1

• 경로 0,1,3,2 : 길이 3, 단순경로

• 경로 0, 1, 3, 0 : 사이클

• 그래프 G2

• 경로 0,1,2 : 단순 경로

• 경로 0, 1, 0 : 사이클

0 1

3 2

G1

0 1 2

G2

(95)

8.1.2 그래프 관련 용어 (4)

• 연결 그래프(connected graph)

서로 다른 모든 정점들 사이에 경로가 있는 무방향 그래프는 연 결 그래프 아니면 단절 그래프(disconnected graph)

• 어느 한 정점에서부터 다른 어떤 정점에로의 경로 존재

• 트리 : 사이클이 없는 연결 그래프 (acyclic connected graph)

• 연결 요소(connected component):

• 최대 연결 부분 그래프(maximal connected subgraph)

• 최대 : 최대의 정점과 최대의 간선

• 예) G : H1, H2 두개의 요소를 가짐

0 1

3 2

G

4

5 6

H

1

H

2

(96)

8.1.2 그래프 관련 용어 (5)

• 강력 연결(strongly connected)

• 방향 그래프 G에서 V(G)에 있는 서로 다른 모든 정점의 쌍 u와 v에 대해 u에 서 v까지, 또한 v에서 u까지의 방향 경 로가 존재

• 예 : G4

• 약한 연결(weakly connected)

• 무방향그래프로 생각할때(에지방향을 무시해서) 모든 정점사이에 경로가 존 재

• 예 : G5

• 강력 연결 요소(strongly connected component)

• 강력 연결된 최대 부분 그래프

• 예) H1 , H2 : G2 의 강력연결요소

0

1 4

3 2

0

1 4

3 2

G4 G5

0 1 2

G2

0 1

H1

2

H2 방향그래프에 대해

(97)

8.1.2 그래프 관련 용어 (6)

• 차수(degree)

• 무방향 그래프의 차수(degree) : 무방향 그래프에서 그 정점에 부속된 간선의 수

예) G1 의 정점 3의 차수 : 3

정점이 n개인 무방향 그래프의 간선 수 e = ( ∑i=0n-1 degree(i) ) / 2

• 방향 그래프의 차수(degree)

• 진입 차수(indegree) : 방향 그래프에서 정점 v를 머 리로 하는 간선의 수

• 진출 차수(outdegree) : 방향 그래프에서 정점 v를 꼬리로 하는 간선의 수

예) 그래프 G2

정점 0 : 진입 차수 = 진출 차수 = 1 정점 1 : 진입 차수 =1, 진출 차수 = 2

0

1

3

2

G1

0 1 2

G2

(98)

8.2 그래프의 표현

• 그래프 표현 방법은 그래프에 수행시키려는 연산과 적용하려는 응용에 따라 선택

8.2.1 인접 행렬(adjacency matrix) 8.2.2 인접 리스트(adjacency list)

8.2.3 인접 다중 리스트(adjacency multilist)

(99)

8.2.1 인접 행렬 (1)

• 인접 행렬(adjacency matrix)

• n≥1개의 정점을 가지는 그래프 G = (V, E)에 대해, 크기가 nⅹn인 2차원 배열 a[n, n]

• 부속 행렬(incidence matrix)이라고도 함

• 인접 행렬로 표현하는데 필요한 공간 : n2 비트

• 무방향 그래프 : 행렬의 상위 삼각이나 하위 삼각만 저장한다면 거의 반 정도의 공간을 절약

• 인접 행렬의 정보

• 무방향 그래프 : 행 i 의 합은 정점 i 의 차수

• 방향 그래프 : 행 i의 합은 정점 i의 진출 차수, 열 i의 합은 정점 i의 진입 차



 

 

E(G) j)

(i, 0,

E(G) j)

(i, 1,

j]

a[i,

(100)

8.2.1 인접 행렬 (2)

0

1

3

2

0 1 2

0

1

3

4 2

G1

G2 G3

0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0

[0] [1] [2] [3]

[0]

[1]

[2]

[3]

a[4, 4]

0 1 0 1 0 1 0 0 0

[0] [1] [2]

[0]

[1]

[2]

a[3, 3]

0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0

[0] [1] [2] [3]

[0]

[1]

[2]

[3]

a[5, 5]

[4]

[4]

그래프 G1, G2, G3에 대한 인접 행렬 표현

(101)

8.2.2 인접 리스트 표현법 (1)

• 인접 리스트(adjacency list)

• n개의 정점 각각에 대한 인접한 정점들을 리스트로 만듦

• 인접 리스트의 구현

• 연결 리스트

• 순차 표현

• 연결 리스트로 표현한 인접 리스트

• 각각의 정점의 리스트 : 헤더 노드와 vertex 필드, link 필 드로 구성된 리스트 노드로 이루어짐

• n개의 정점과 e개의 간선을 가진 그래프에서

• 무방향 그래프는 n개의 헤더 노드와 2e개의 리스트 노드 필요

• 방향 그래프는 n개의 헤더 노드와 e개의 리스트 노드 필요

(102)

8.2.2 인접 리스트 표현법 (2)

0

1

3

2

0 1 2

G1

G2

header vertex link [0]

[1]

[2]

[3]

3 null

3 null 1

0 2

1 3 null

0 1 2 null

null

header [0]

[1]

[2]

null 1

0 2 null

(a) G1에 대한 인접 리스트

(b) G2에 대한 인접 리스트

(103)

8.2.2 인접 리스트 표현법 (3)

• 역인접 리스트(inverse adjacency list)

• 각 정점 i에 대해, 정점 i로 진입하는 모든 정점 각각에 대한 노드를 포함시 킨 리스트

1 2

G2

header [0]

[1]

[2]

1 null 0 null 1 null

0

null [0]

[1]

[2]

null 1

0 2 null

인접리스트

역인접리스트

header

(104)

8.2.3 인접 다중 리스트 표현법 (1)

• 인접 다중 리스트(adjacency multilist)

• 다중 리스트

• 노드들을 여러 리스트들이 공용하는 리스트

• 특정 간선에 대한 접근 여부를 표시하는 데 편리

• 간선에 부속된 두 정점 각각에 대한 인접 리스트를 다중 리 스트로 유지하여, 하나의 간선을 두 개의 리스트가 공유하는 리스트

• 간선 (i, j)를 표현하는 노드 구조

• M : 간선이 이미 검사되었는지 여부를 표시하는 마크 비트

• i-link, j-link : 각각 정점 i, j에 대한 인접 리스트의 링크

M i j i-Link j-Link

(105)

8.2.3 인접 다중 리스트 표현법 (2)

• 클래스 노드의 정의

Public class edge { boolean M;

int i;

int j;

edge i-link;

edge j-link;

}

edge [] headnode new edge[n]

(106)

8.2.3 인접 다중 리스트 표현법 (3)

• G1에 대한 인접 다중 리스트의 식별

• 정점 0의 경우

• 정점 0의 헤더로부터 노드 E0를 따라감

• 노드 E0에서 정점 0을 포함한 필드 = i i-link를 따라 E1으로 감

• 노드 E1의 첫 번째 i 필드가 정점 0 포 함 다시 i-link를 따라감

• 이 때 링크값이 널 여기서 리스트가 끝남

• 위의 방법으로 모든 정점들을 식별

[0]

[1]

[2]

[3]

G1에 대한 인접 다중 리스트 header

E2 E1

0 1

E0

E3 null

3

E1 0

E4 E3

2

E2 1

E4 null

3

E3 1

null null

3

E4 2

0

1

3

2

G1 E0

E1

E3 E4 E2

정점 0 : E0  E1

정점 1 : E0  E2  E3 정점 2 : E2  E4

정점 3 : E1  E3  E4

(107)

8.3 그래프의 운행

• 그래프 운행(traverse)

• 주어진 어떤 정점을 출발하여 체계적으로 그래프의 모든 정점들을 방문 하는 것

• 그래프 운행법의 종류

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

• 넓이 우선 탐색(Breadth First Search)

• 그래프 운행의 응용

• 연결 요소(Connected component)

• 신장 트리(Spanning tree)

(108)

8.3.1 깊이 우선 탐색 (1)

• 깊이 우선 탐색(depth first search : DFS)

1) 정점 i를 방문한다.

2) 정점 i에 인접한 정점 중에서 아직 방문하지 않은 정점이 있으면, 이 정점들을 모두 스택에 저장한다.

3) 스택에서 정점을 삭제하여 새로운 i를 설정하고, 단계 (1) 을 수행한다.

4) 스택이 공백이 되면 연산을 종료한다

• 정점 방문 여부를 표시

배열 visited[n]을 이용하여 표현

않았음 방문하지

false,

방문하였음

true,

visited[i]

(109)

8.3.1 깊이 우선 탐색 (1)

• 깊이 우선 탐색(depth first search : DFS)

1) 정점 i를 방문한다.

2) 정점 i에 인접한 정점 중에서 아직 방문하지 않은 정점이 있으면, 이 정점들을 모두 스택에 저장한다.

3) 스택에서 정점을 삭제하여 새로운 i를 설정하고, 단계 (1) 을 수행한다.

4) 스택이 공백이 되면 연산을 종료한다

• 정점 방문 여부를 표시

배열 visited[n]을 이용하여 표현

않았음 방문하지

false,

방문하였음

true,

visited[i]

(110)

8.3.1 깊이 우선 탐색 (2)

• 깊이 우선 탐색 알고리즘

Public void DFS(int vtx) {

node w;

marked[vtx]=true;

for (w=graph[vtx]; w!=null; w=w.link)

if (marked[w.vertex]!=true) DFS(w.vertex);

}

(111)

8.3.2 너비 우선 탐색 (2)

• 너비 우선 탐색 (breadth first search ; BFS)

• 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어 져 있는 정점을 나중에 방문하는 순회 방법

• 큐를 사용하여 구현됨

(112)

8.3.2 너비 우선 탐색 (2)

• 너비 우선 탐색 알고리즘

Public class queue {

int vertex;

queue link;

}

Public void BFS(int vtx){

node w;

queue front;

queue rear;

front=rear=null;

marked[vtx]=true;

ADDQ(front,rear,vtx);

while(front!=null){

vtx=DELETEQ(front);

for(w=graph[vtx];w!=null;w=w.link) if (maked[w.vertex]!=true){

ADDQ(front,rear,w.vertex);

marked[w.vertex]=true;

} }

}

(113)

8.3.4 그래프 운행의 응용

• 연결 요소

• 연결 그래프 여부 판별

• DFS나 BFS 알고리즘 이용

• 무방향 그래프 G에서 하나의 정점i에서 시작하여 DFS(or BFS)로 방문한 노드집합 V(DFS(G, i))가 V(G)와 같으면 G는 연결 그래프.

• 연결 요소 찾기

• 정점 i에 대해 DFS (or BFS) 수행

• 둘 이상의 연결 요소가 있는 경우, 나머지 정점 j에 대해 DFS(or BFS) 반복 수행

V(DFS(G, i)) = V(G) : 연결 그래프, 하나의 연결 요소

V(DFS(G, i))⊂ V(G) : 단절 그래프, 둘 이상의 연결 요소

(114)

8.3.4 그래프 운행의 응용

• 연결 요소를 찾는 알고리즘

Public void CONCOMP(void) {

int i;

for(i=0;i<n;i++) marked[i]=false;

for(i=0;i<n;i++)

if(marked[i]!=true){

DFS(i);

System.out.println(“\n”);

} }

(115)

8.4 그래프의 트리화

8.4.1 신장 트리

8.4.2 최소 비용 신장 트리

(116)

8.4.1 신장 트리 (1)

• 신장 트리(spanning tree)

• 그래프 G에서 E(G)에 있는 간선과 V(G)에 있는 모든 정점들 로 구성된 트리

• DFS, BFS에 사용된 간선 집합 T는 그래프 G의 신장 트리를 의미

• 주어진 그래프 G에 대한 신장 트리는 유일하지 않음

(a) 연결 그래프 G (b) 신장 트리 그래프 G에 대한 3개의 신장 트리

(117)

8.4.1 신장 트리 (2)

• 신장 트리의 종류

• 깊이 우선 신장 트리(depth first spanning tree) : DFS 사 용

• 너비 우선 신장 트리(breadth first spanning tree) : BFS 사용

0

1 3

2

4 5

6

(a) 연결 그래프 G

0

1 3

2

4 5

6

(b) DFS(0) 신장 트리

0

1 3

2

4 5

6

(c) BFS(0) 신장 트리 연결 그래프 G와 신장 트리

(118)

8.4.2 최소 비용 신장 트리 (1)

• 최소비용신장트리(MST: minimu spanning tree): 네트워크에 있 는 모든 정점들을 가장 적은 수의 간선과 비용으로 연결하는 신 장트리

• MST의 응용

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

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

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

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

(119)

8.4.2 최소 비용 신장 트리 (2)

• 2가지의 대표적인 알고리즘

• Kruskal의 알고리즘

• Prim의 알고리즘

• 탐욕적인 방법(greedy method)

• 알고리즘 설계에서 있어서 중요한 기법 중의 하나

• 결정을 해야 할 때마다 그 순간에 가장 좋다고 생각되는 것 을 해답으로 선택함으로써 최종적인 해답에 도달

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

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

(120)

8.4.2 최소 비용 신장 트리 (3)

• Prim의 MST 알고리즘

• Prim의 알고리즘은 시작 정점에서부터 출발하여 신장 트리 집합을 단계적으로 확장해나가는 방법

• 시작 단계에서는 시작 정점만이 신장 트리 집합에 포함

• 앞 단계에서 만들어진 신장 트리 집합에, 인접한 정점들 중에서 최 저 간선으로 연결된 정점을 선택하여 트리를 확장

• 이 과정은 트리가 n-1개의 간선을 가질 때까지 계속된다.

간선 (a, b)와 간선 (f, e)의 가중치를

비교해보면 (f, e)가 27로서 (a, b)의 29보다

높다. 따라서 (f, e) 간선이 선택되고 정점 e가

신장 트리 집합에 포함된다.

(121)

8.4.2 최소 비용 신장 트리 (4)

• Prim의 MST 알고리즘

(122)

8.4.2 최소 비용 신장 트리 (5)

• Kruskal의 MST 알고리즘

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

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

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

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

(123)

8.4.2 최소 비용 신장 트리 (6)

• Kruskal의 MST 알고리즘

(124)

8.5 그래프의 응용

8.5.1 최단 경로 검색

8.5.2 모든 정점간의 최단경로 8.5.3 이행적 폐쇄행렬

8.5.4 위상정렬

8.5.5 유통문제

8.5.6 임계경로

(125)

8.5.1 최단 경로 검색 (1)

• 최단 경로(shortest path):

• 최단경로 문제는 네트워크에서 정점 i와 정점 j를 연결하는 경로 중에서 간선들의 가중치 합이 최소가 되는 경로를 찾는 문제

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

(126)

8.5.1 최단 경로 검색 (2)

• 디익스트라(Dijkstra)의 최단 경로 알고리즘

• Dijkstra의 최단 경로 알고리즘은 네트워크에서 하나의 시작 정점으로부터 모든 다른 정점까지의 최단 경로를 찾는 알고 리즘

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

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

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

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

(127)

8.5.1 최단 경로 검색 (3)

1 2

3

4

5

6 7

0 San Francisco

Denver

Chicago

Miami New Orleans

Los Angeles

800

1200

1500

250

1000

1400

900 1000

1700 1000

300

Boston

New York

0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7 0

300 1000

1700

0 800

0 1500 1000

0 1200

0

250 0

900 0

1400 1000 0

Itera

-tion S Vertex

selected

Distance

LA SR DEN CHI BOST NY MIA NO

[0] [1] [2] [3] [4] [5] [6] [7]

Initia l 1 2 3 4 5 6

{4}

{4,5}

{4,5,6}

{4,5,6,3}

{4,5,6,3,7}

{4,5,6,3,7,2}

{4,5,6,3,7,2,1}

5 6 3 7 2 1

+∞ +∞ +∞ 1500 0 250 +∞ +∞

+∞ +∞ +∞ 1500 0 250 1150 1650 +∞ +∞ +∞ 1500 0 250 1150 1650 +∞ +∞ 2450 1500 0 250 1150 1650 3350 +∞ 2450 1500 0 250 1150 1650 3350 3250 2450 1500 0 250 1150 1650 3350 3250 2450 1500 0 250 1150 1650

(128)

8.5.1 최단 경로 검색 (3)

• 디익스트라(Dijkstra)의 최단 경로

(129)

8.5.2 모든 정점간의 최단 경로

• 알고리즘

Public void FLOYD(int [][] A, fload [][] cost, int n) {

int i,j,k;

for(i=0;j<n;i++) for(j=0;j<n;j++) A[i][j]=cost[i][j];

for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++)

if(A[i][k]+A[k][j]<A[i][j]

A[i][j]=A[i][k]+A[k][j];

}

0 1

2

6 4

3 2

11

A-1 0 1 2 0 4 11 6 0 2 3 ∞ 0 0

1 2

A0 0 1 2 0 4 11 6 0 2 3 7 0 0

1 2

A1 0 1 2 0 4 6 6 0 2 3 7 0 0

1 2 A2 0 1 2

0 4 6 5 0 2 3 7 0 0

1 2

(130)

8.5.3 이행적 폐쇄 행렬

• 이행적 폐쇄 행렬(Transitive closure matrix)

Definition: Transitive closure matrix A+

Reflexive transitive closure A*

0 1 2 3 5

(a) 방향 그래프 G

0 1 2 3 4 0

1 2 3 4

0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0

0 1 2 3 4 0

1 2 3 4

0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1

0 1 2 3 4 0

1 2 3 4

1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 (b) G의 인접행렬 A

(d) A* (c) A+

(131)

8.5.4 위상정렬 (1)

• 위상정렬(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번 정점을 시작할 수 있다.

참조

관련 문서

그는 런던에서 겨울을 보냈다. 그들은 강가에서 고기를 잡았다. 한국어: 명사와 동사의 엄격한 구분. 한국어와 영어의 인지적 차이.. 즉, 영어권 화자들이 한국어의

즉 축은 y축 의 왼쪽에 있고 y절편은 a&lt;0이므로 그래프의 모양은 오른쪽

k&gt;0이면 직선 y=k와 주어진 그래프의 교점이 2개이므로 일대일함수도 일대일대응도 아니다. 따라서 보기의 그래프 중

금융산업의 경쟁력 제고를 위한 제도정비의

모든 x축 방향(i)성분과 y축 방향(j)성분들의 합을 구한다.. b) 합력 벡터를 얻기 위해 각방향 성분들을 더한다. c) 합력성분을 구하는 방법으로 합력의 크기와

속도와 가속도에 대한 문제는 직선 운동에 한하여 다 룬다... ② 일차함수의

여기에서 은퇴연령이란 경제활동을 그만두고 노동시장으로부터 퇴 장하는 연령임... 이는 고령층의 경제활동참가율을 떨어뜨리는

그래프의 점근선의 방정식은 y=-4이다... 치역은