반응형
SMALL

주요용어

그래프 탐색 : 그래프 내 특정 정점을 찾는 연산, 트리와 다르게 루트노드가 없으므로 특정 정점에서 시작함(트리에서 노드로 부르는 것을 그래프에서 정점이라 함)
그래프 순회 : 특정 정점에서 시작하여 그래프의 모든 정점을 빠짐없이 그리고 중복 없이 방문하는 것
깊이 우선 탐색 : 그래프 순회 알고리즘의 하나로 특정 점정에서 시작하여 자손을 먼저 방문 한 후 (더 이상 방문 할 자손이 없으면) 전 단계 형제를 방문함
너비 우선 탐색 : 특정 정점에서 시작하여 모든 형제를 방문한 후 자손을 방문함
최소 비용 신장 트리 : 그래프의 모든 정점을 포함하는 사이클이 없는 부분 그래프 즉, 트리를 신장트리라 하며, 가중 그래프에서 비용이 최소인 신장 트리를 최소 비용 신장 트리라 함

 

 

01. 그래프의 탐색

그래프 탐색의 정의

- 그래프에서 특정 정점을 찾는 기본 연산

- 그래프 G = ( V, E)와 V(G)에 있는 정점이 v가 주어졌을 때, 정점 v 에 도달할 때까지 G의 정점을 방문하는 연산

   -> 만일 없다면 그래프의 모든 정점을 방문한 후 종료함

- 그래프 순회에는 깊이 우선 탐색(DepthFirstSearch;DFS) 과 너비 우선 탐색(BreadthFirstSearch;BFS) 두 가지 방법이 있음

 

- 출발점 v 를 방문하는 것으로 시작

  -> 다음으로 v 에 인접하고 아직 방문하지 않은 정점 w를 선택하여 w를 출발점으로 다시 깊이 우선 탐색을 시작함

  -> 두 과정을 모든 정점을 한 번씩 방문 할 때까지 반복함

 

깊이 우선 탐색

- 만약 인접한 모든 정점들이 이미 방문한 정점인 경우는 가장 최근에 방문했던 정점 중에서, 방문하지 않은 정점 w 를 가진 정점을 선택하여 정점 w 로부터 다시 깊이 우선 탐색을 시작함

- 미 방문 정점이 없으면 탐색을 종료함

 

깊이 우선 탐색 ­ 무방향 그래프

순환 호출을 이용한 깊이 우선 탐색

void DFS(int v){
	int w;
	extern int VISITED[];
	VISITED[v] = 1;
	while(v에 인접한 모든 정점 w)
		if(!VISITED[w])
			DFS(w); }

 

스택을 직접 운영하는 깊이 우선 탐색

 

void DFS(int v){
	int n,w ;
	extern struct stack*s;
	extern int VISITED[];
	InitializeStack(s);
	push(s,v);
	VISITED[v]=1;
	while((n=pop(s))>=0){
		VISITED[n]=1;
		while(n에 인접한 모든 정점 w){
			if(!VISITED[w]){
				push(s,w); } } } } 

 

 

너비 우선 탐색

- 출발점 v를 방문하는 것으로 시작함

-> 다음으로 v에 인접한 정점 w를 모두 방문한 후 다시 w에 인접한 방문하지 않은 정점들을 차례로 방문함

-> 두 과정을 모든 정점을 한 번씩 방문할 때까지 반복함

 

- 너비 우선 탐색은 인접 정점을 모두 방문하기 때문에 스택이 필요하지 않고, 대신 큐를 사용함

큐를 이용한 너비 우선 탐색

void BFS(intv){
	int w;
	extern struct queue*q;
	VISITED[v]=1;
	InitializeQueue(q);
	AddQueue(q,v);
	while(!q_empty()){
		v = DeleteQueue(q);
		while(v에 인접한 모든 정점 w){
			if(!VISITED[w]){
				AddQueue(q,w);
				VISITED[w]=1; } } } } 

 

반응형
LIST

'방송통신대학 > 자료구조' 카테고리의 다른 글

15-2. 최소신장트리  (0) 2021.01.16
14-2. 그래프 표현법, 추상자료형  (0) 2021.01.14
14-2. 그래프 표현법, 추상자료형  (0) 2021.01.14
14-1. 그래프  (0) 2021.01.13
13-3. 레드 블랙 트리  (0) 2021.01.12

+ Recent posts