방향 그래프

Download Report

Transcript 방향 그래프

Graphs
Ikjun Yeom
Introduction
 개요..
– Konigsberg 다리 문제
– 차수(degree) : 정점에 연결된 간선의 수
– 오일러 행로(Eulerian walk)
g
c
d
C
A
Kneiphof
D
e
C
c
a
B
f
b
(a) Koenigsberg의 Pregal강의 일부
2
a
A
B
g
d
e
D
b
f
(b) 오일러의 그래프
Definitions
 그래프 G : 2개의 집합 V와 E로 구성
– V : 공집합이 아닌 정점(vertex)의 유한집합
– E : 간선(edges)이라고 하는 정점 쌍들의 집합
– 표기 : G=(V,E)
 무방향그래프(undirected graph)
– 간선을 나타내는 정점의 쌍에 순서 없음
 방향 그래프(directed graph)
– 방향을 가지는 정점의 쌍 <u, v>로 표시
(u는 꼬리(tail), v는 머리(head))
– <v, u>와 <u, v>는 서로 다른 간선
3
Definitions
– 예제 그래프
0
0
1
2
3
G1
00
1
3
2
4
G2
5
1
6
2
G3
• V(G1)={0,1,2,3}
E(G1)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}
• V(G2)={0,1,2,3,4,5,6)
E(G2)={(0,1),(0,2),(1,3),(1,4),(2,5),(2,6)}
• V(G3)={0,1,2}
E(G3)={<0,1>,<1,0>,<1,2>}
4
Definitions
– 그래프의 제한 사항
• 자기 간선(self edge) 또는 자기 루프(self loop) 없음
• 동일 간선의 중복 없음(다중그래프(multigraph))는
이 제한이 없음
0
0
0
0
1
0
1
0
2
0
3
0
2
0
자기 간선을 가진 그래프
다중 그래프
 완전 그래프(complete graph) : n개의 정점과 n(n-1)/2개의 간선을
가진 그래프
 (u,v)가 E(G)의 한 간선이라면
 u와 v는 인접(adjacent)한다
 간선 (u,v)는 정점 u와 v에 부속(incident)된다
 그래프 G의 부분그래프(subgraph)
: V(G')  V(G) 이고 E(G')  E(G)인 그래프 G'
5
Definitions
 정점 u로부터 정점 v까지의 경로(path)
– 그래프 G에서 (u,i1), (i1,i2), ..., (ik,v)를 E(G)에 속한
간선들이라 할 때, 정점열 u, i1, i2, ..., ik, v를 말함
 경로의 길이(length)
– 경로상에 있는 간선의 수
 단순 경로(simple path)
– 경로상에서 처음과 마지막을 제외한 모든 정점들이 서로 다름
 단순 방향 경로(simple directed path)
 사이클(cycle)
– 처음과 마지막 정점이 같은 단순 경로
6
Definitions
0
0
0
0
1
1
2
2
1
1
2
2
3
(i)
(ii)
3
(iii)
(iv)
G1의 서브그래프
G1
00
0
0
0
0
1
1
1
2
2
2
(ii)
(iii)
(iv)
1
2
G3
3
(i)
G3의 서브그래프
7
Definitions

연결 요소(connected component)
: 최대 연결 부분 그래프(maximal connected subgraph)

강력 연결(strongly connected)
: 방향그래프에서 V(G)에 속한 서로 다른 두 정점 u, v의
모든 쌍에 대해서, u에서 v로, 또한 v에서 u로의 방향
경로(directed path)가 존재

강력 연결 요소(strongly connected component)
: 강하게 연결된 최대 부분그래프
H1
4 H2
0
2
1
5
3
6
7
G4
두 개의 연결요소를 갖는 그래프
8
Definitions
0
G3의 강력 연결요소
1




차수(degree) : 정점에 부속한 간선들의 수
진입차수(in-degree)

임의의 정점 v가 머리가 되는 간선들의 수

v가 꼬리가 되는 간선들의 수
진출차수(out-degree)
간선의 수
n 1
e  ( d i ) / 2
0

2
(n개의 정점과 e개의 간선을 가진 그래프)
다이그래프(digraph) : 방향 그래프
9
ADT Graph
ADT Graph
objects: 공집합이 아닌 정점의 집합과 무방향 간선의 집합으로 각 간선은 정점의 쌍이다.
functions:
for all graph ∈ Graph, v, v1, and v2 ∈ Vertices
Graph Create()
::= return an empty graph
Graph InsertVertex(graph, v)
::= return a graph with v inserted
v has no incident edges
Graph InsertEdge(graph, v1, v2) ::= return a graph with a new edge
between v1 and v2
Graph DeleteVertex(graph, v)
::= return a graph in which v and all edges
incident to it are removed
Graph DeleteEdge(graph, v1, v2) ::= return a graph in which the edge(v1, v2) is removed
Leave the incident nodes in the graph
Boolean IsEmpty(graph)
::= if(graph = = empty graph) return TRUE
else return FALSE
List Adjacent(graph, v)
::= return a list of all vertices that are adjacent to v
< 그래프 추상 데이타 타입 >
10
Graph Representation
 인접행렬 (Adjacency Matrix)
–
–
–
–
–
G=(V,E)는 정점의 수가 n(n≥1)인 그래프
인접행렬 : nn의 2차원 배열
간선 (vi, vj)E(G)  a[i][j]=1
간선 (vi, vj)E(G)  a[i][j]=0
필요 공간 : n2 비트
0
1
2
3
0
0
1
1
1
1
1
0
1
1
2
1
1
0
1
3
1
1
1
0
G1 의 인접행렬




0
0 0
1 1
2 0
1
1
0
0
2
0
1
0
G3 의 인접행렬
0 1 2 3 4 5
0 0 1 1 0 0 0
1 1 0 0 1 0 0
2 1 0 0 1 0 0
3 0 1 1 0 0 0
4 0 0 0 0 0 1
5 0 0 0 0 1 0
6 0 0 0 0 0 1
7 0 0 0 0 0 0
G4 의 인접행렬
n 1
무방향 그래프: 어떤 정점 i의 차수는 그 행의 합 : 
j 0
방향 그래프: 행의 합은 진출차수, 열의 합은 진입차수
인접행렬의 수행 시간 : 최소한 O(n2)
희소 그래프(sparse graph) : O(e+n)
a[i][ j ]
11
6
0
0
0
0
0
1
0
1
7
0
0
0
0
0
0
1
0
Adjacency Lists
– 인접행렬의 n행들을 n개의 chains으로 표현
– n개의 정점, e개의 간선의 무방향 그래프
• n개의 헤드노드, 2e개의 리스트 노드가 필요
– 방향그래프 : e개의 리스트 노드
– 연결 리스트 노드의 순차적 저장 : 배열 node[]
• node[i] = 정점 i에 대한 리스트의 시작 지점
• Node[n] = n + 2e – 1
• 정점 i와 인접한 정점
 node[i], … , node[i+1]-1에 저장 (0≤i≤n)
– 역인접리스트(inverse adjacency lists)
• 리스트가 표현하는 정점에 인접한 각 정점에 대해 하나의 노드를 둠
12
Adjacency List
adjLists
[0]
[1]
[2]
[3]
data link
3
1
2
0
2
3
0
0
1
3
0
0
0
1
2
0
G1 인접 리스트
adjLists
[0]
[1]
[2]
1
0
2
0
0
0
G3 인접 리스트
adjLists
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
2
1
0
3
0
0
0
3
0
1
2
0
6
4
0
5
7
0
5
6
0
0
G4 인접 리스트
(
13
Adjacency List
int nodes[n + 2*e +1];
0
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18 19 20 21 22
9 11 13 15 17 18 20 22 23 2 1 3 0 0 3 1 2 5 6 4 5 7 6
그래프 G4의 순차 표현
[0]
1
0
[1]
0
0
[2]
1
0
G3의 역인접리스트
14
Orthogonal List Representation
헤더노드
0
1
0
0 1 0 0
1
2
2
1 0 0
1 2 0 0
0
그래프 G3에 대한 직교 리스트 표현
15
Weighted Edges
 그래프의 간선에 가중치(weights) 부여
 인접행렬 : 행렬 엔트리에 a[i][j]의 가중치 정보 저장
 인접리스트 : 노드 구조에 weight 필드를 추가
 네트워크(network) : 가중치 간선을 가진 그래프
16
Depth First Search
출발 정점 v를 방문
v에 인접하고 방문하지 않은 한 정점 w를 선택
w를 시작점으로 다시 깊이 우선 탐색 시작
모든 인접 정점을 방문한 정점 u에 도달하면, 최근에
방문한 정점 중 아직 방문을 안한 정점 w와 인접하고 있는
정점으로 되돌아감
(5) 정점 w로부터 다시 깊이 우선 탐색 시작
(1)
(2)
(3)
(4)
(6) 방문을 한 정점들로부터 방문하지 않은 정점으로 더 이상
갈 수 없을 때 종료
17
Depth First Search
#define FALSE 0
#define TRUE 1
short int visited[MAX_VERTICES];
void dfs (int v)
{/* 그래프의 정점 v에서 시작하는 깊이 우선 탐색 */
nodePointer w;
visited[v] = TRUE;
printf(“%5d”, v);
for (w = graph[v]; w; w = w → link)
if (!visited [w→vertex])
dfs (w→vertex);
}
깊이-우선 탐색
18

Depth First Search
예제 6.1
 0, 1, 3, 7, 4, 5, 2, 6 순으로 방문
0
1
2
3
4
6
7
(a)
adjLists
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
5
1
2
0
3
4
0
0
5
6
0
1
7
0
1
7
0
2
7
0
2
7
0
3
4
0
5
6
(b) 그래프 G와 그 인접리스트
19
0
Breadth-First Search
– 시작 정점 v를 방문
– v에 인접한 모든 정점들을 방문
– 새롭게 방문한 정점들에 인접하면서 아직 방문하지
못한 정점들을 방문
 예제 6.2
– 0, 1, 2, 3, 4, 5, 6, 7 순으로 방문
0
1
3
2
4
5
7
20
6
Breadth-First Search
void bfs(int v)
{/* 정점 v에서 시작하는 너비 우선 탐색. 전역배열 visited는 0으로
초기화됨}
node_pointer w;
queue_pointer front, rear;
front = rear = NULL; /* 큐의 초기화 */
printf(“%5d”, v);
visited[v] = TRUE;
addq(&front, &rear, v);
while (front){
v = deleteq(&front);
for (w=graph[v]; w; w=w→link)
if (!visited[w→vertex]) {
printf(“%5d”, w→vertex);
addq(&front, &rear, w→vertex);
visited[w→vertex] = TRUE;
}
}
}
21
Connected Components
 연결요소(connected component)
– 방문하지 않은 정점 v에 대해 DFS(v) 또는 BFS(v)를 반복 호출로 구함
void connect(void)
{ /* 그래프의 연결 요소 결정 */
int i;
for (i=0; i<n; i++)
if (!visited[i]) {
dfs(i);
printf(“\n”);
}
}

Component의 분석
 인접리스트로 표현: 모든 연결요소들 생성 시간은 O(n+e)
 인접행렬로 표현 : O(n2)
22
Spanning Tree

신장트리(spanning tree) : G의 간선들로만 구성되고 G의 모든 정점들이 포
함된 트리
– 깊이-우선 신장트리(depth-first spanning tree)
– 너비-우선 신장트리(breadth-first spanning tree)
완전 그래프와 이 그래프의 세 신장트리
0
0
1
3
2
4
5
1
6
3
7
2
4
5
7
(a) DFS(0) 신장 트리
(b) BFS(0) 신장 트리
23
6