프로그래밍 기초/알고리즘

그래프 알고리즘

niamdank 2022. 1. 21. 13:33

  동적 프로그래밍 

그래프 기본 개념

현상이나 사물을 정점과 간선으로 표현하는 것을 말한다.

  • 정점(Vertex) 대상이나 개체
  • 간선(Edge) 대상이나 개체 간의 관계

 

그래프는 간선이 상호 통행이 가능한지, 일방통행만 가능한지에 따라 유향 그래프와 무향 그래프로 나뉜다.

  • 유향 그래프 정해진 방향으로만 이동이 가능한 그래프, 화살표로 간선을 표현한다.
  • 무향 그래프 쌍방으로 이동이 가능한 그래프, 실선으로 간선을 표현한다.

 

쉽게 배우는 알고리즘 그래프 그림 9-1, 9-3

 

또, 각각의 정점이 가지는 관계의 정도를 간선에 가중치로 표현하기도 한다.

 

쉽게 배우는 알고리즘 그래프 그림 9-2, 9-4

 

인접 행렬을 이용한 그래프의 표현

각 행, 열을 순서대로 정점을 나타내고 각각의 간선은 해당하는 행, 열의 위치에 값을 할당하는 방식으로 그래프를 표현하여 이해하기 쉽고 간선의 존재 여부를 곧바로 파악할 수 있다.

 

가중치를 가지는 그래프의 경우 단순히 행렬에 적용하는 값을 가중치로 넣어 표현한다.

 

쉽게 배우는 알고리즘 그래프 그림 9-5, 9-8

 

※ 간선의 밀도가 아주 높은 그래프의 경우 인접 행렬 표현이 적합하다.

 

인접 리스트를 이용한 그래프의 표현

인접 리스트 표현법은 리스트를 정점의 길이만큼으로 만들고 각 정점이 연결된 정점을 노드로 연결하는 방식으로 행렬 표현 방식에 비해 공간의 낭비가 없다는 장점이 있다.

 

노드의 구성은 기본적으로 <정점 번호, 다음 노드의 포인터>로 구성되며 가중치를 가지는 그래프의 노드는 추가로 가중치를 넣어 표현한다.

 

쉽게 배우는 알고리즘 그래프 그림 9-10

 

※ 모든 가능한 정점 쌍에 비해 간선의 수가 적은 그래프의 경우 유용하게 사용할 수 있다.

 

너비 우선 탐색과 깊이 우선 탐색

그래프에서 모든 정점을 탐색하는 방법에는 레벨의 모든 노드를 방문하는 것을 우선하는 너비 우선 탐색(Breath First Search)과 루트에서부터 한 방향으로 리프 노드가 나올 때까지 진행하는 깊이 우선 탐색(Depth First Search)이 존재한다.

 

쉽게 배우는 알고리즘 그래프 그림 9-11

 

너비 우선 탐색 알고리즘

너비 우선 탐색은 먼저 방문한 노드를 먼저 처리하는 FIFO 방식이므로 Queue를 사용한다.

 

BFS 알고리즘

BFS(G, s)
{
	for each v ∈ V - {s}
	{
		visited[v] ← NO;
	}

	visited[s] ← YES;
	enqueue(Q, s);

	while (Q ≠ ∮)
	{
		u ← dequeue(Q);
		for each v ∈ L(u)
		{
			if (visited[v] = NO) then
			{
				visited[v] ← YES;
				enqueue(Q, v);
			}
		}
	}
}

 

깊이 우선 탐색 알고리즘

깊이 우선 탐색은 나중에 방문한 노드를 먼저 처리하는 LIFO 방식이므로 Stack을 사용한다.

 

DFS 알고리즘

DFS(G, s)
{
	for each v ∈ V - {s}
	{
		visited[v] ← NO;
	}

	for each v ∈ V - {s}
	{
		if (visited[v] = NO) then
		{
			aDFS(v);
		}
	}
}

aDFS(v)
{
	visited[s] ← YES;
	for each v ∈ L(u)
	{
		if (visited[v] = NO) then
		{
			aDFS(v);
		}
	}
}

 

https://github.com/NadanKim/Algorithm

 

GitHub - NadanKim/Algorithm: 알고리즘 학습 및 예제 코드 작성을 위한 저장소

알고리즘 학습 및 예제 코드 작성을 위한 저장소. Contribute to NadanKim/Algorithm development by creating an account on GitHub.

github.com