다익스트라 알고리즘

한 정점으로 부터 모든 정점으로의 최단거리를 구하는 알고리즘이다. 

다만 음의 간선이 있다면 사용할 수 없다. 

 

동작 순서는 일단 출발지를 정하고, 이어져 있는 거리를 저장한다.

그 다음 부터는 가장 짧은 거리에 있는 정점을 방문하고, 해당 정점을 거쳐가는 거리가 더 짧다면 갱신, 아니면 그대로 둔다.

이런식으로 반복해서 모든 정점을 방문하면 끝나게 된다.

 


그래프와 인접그래프

 

 

 

 

 

다익스트라 알고리즘 시작!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

추가적으로,, 최적화에 대해 생각해본다면, 가장 짧은 거리를 탐색할 때, 우선순위 큐를 활용한다면 O(nlogN)으로 탐색이 가능하다. 

 


관련문제

https://www.acmicpc.net/problem/4485

 

4485번: 녹색 옷 입은 애가 젤다지?

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

https://jinniepark.tistory.com/67

 

[백준][4485]녹색 옷 입은 애가 젤다지?

/* 문제설명 */ 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설

jinniepark.tistory.com

 

플로이드-와샬 알고리즘(이하 플로이드 알고리즘)은 최단 경로를 구하는 알고리즘이다.

이미 잘 알고있는 다익스트라 알고리즘은 한 점점으로 부터 다른 모든 정점으로의 최단 거리를 구할 수 있다.

하지만 플로이드 알고리즘은 모든 정점으로부터 모든 정점으로의 최단 거리를 구하는 알고리즘이다.

 

기본적으로 그래프를 일단 나타내고, 순차적으로 어떠한 정점을 거쳤을 때, 이동하는 비용이 줄어든다면 값을 고치는것을 반복하는 알고리즘이다. 

중요한건 (A에서 B로 가는 거리) > (A에서C를 들렀다가 B로 가는거리)이면 작은 값으로 계속 갱신만 해주면 되는거다.

말로하려니까 어렵다. 아래에 그림을 참고해라.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

관련 문제

https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

https://jinniepark.tistory.com/64

 

[백준][11404]플로이드

/* 문제설명 */ n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도

jinniepark.tistory.com

 

Kruskal 알고리즘 

MST(최소 신장 트리)를 구현하는 방법으로는 크루스칼 알고리즘과 프림 알고리즘이 있다.

오늘은 크루스칼 알고리즘에 대해 더 자세히 살펴보도록 하겠다.

 

크루스칼 알고리즘은 일단 모든 간선을 오름차순으로 정렬하고

순서대로 이어나가다가 사이클이 발생하면 해당 간선은 건너뛴다. 참으로 간단하다.

 

크루스칼은 프림에 비해 희소 그래프인 경우, 그러니까 간선이 적은 경우 적합하고,

프림은 크루스칼에 비해 간선이 많이 존재하는 밀집그래프에 더 적합하다.

 

프림 알고리즘은 아래에서 더 자세하게 다룬다.

https://jinniepark.tistory.com/46

 

[알고리즘 기본]PRIM 알고리즘

PRIM 알고리즘 MST(최소 신장 트리)를 구현하는 방법으로는 크루스칼 알고리즘과 프림 알고리즘이 있다. 오늘은 프림 알고리즘에 대해 더 자세히 살펴보도록 하겠다. 프림 알고리즘을 시작점을 중

jinniepark.tistory.com

 

일단을 개념적으로 구하는 방법을 그려보았다.


 

 

이때 사이클을 검사하는 알고리즘은 Union-Find 알고리즘이 쓰인다.


관련문제

https://www.acmicpc.net/problem/1922

 

1922번: 네트워크 연결

이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.

www.acmicpc.net

https://jinniepark.tistory.com/56?category=952224

 

[백준][1922]네트워크 연결

/* 문제설명 */ 도현이는 컴퓨터와 컴퓨터를 모두 연결하는 네트워크를 구축하려 한다. 하지만 아쉽게도 허브가 있지 않아 컴퓨터와 컴퓨터를 직접 연결하여야 한다. 그런데 모두가 자료를 공유

jinniepark.tistory.com

 

PRIM 알고리즘

MST(최소 신장 트리)를 구현하는 방법으로는 크루스칼 알고리즘과 프림 알고리즘이 있다.

오늘은 프림 알고리즘에 대해 더 자세히 살펴보도록 하겠다.

 

프림 알고리즘을 시작점을 중심으로 방문 가능한 모든 정점을 방문해서 가장 최소 가중치를 가지는 노드와 연결하고,

이를 모든 정점을 방문할 때 까지 반복함으로써 최소 신장 트리를 구한다.

 

크루스칼은 프림에 비해 희소 그래프인 경우, 그러니까 간선이 적은 경우 적합하고,

프림은 크루스칼에 비해 간선이 많이 존재하는 밀집그래프에 더 적합하다.

 

크루스칼 알고리즘은 아래에서 더 자세하게 다룬다.

https://jinniepark.tistory.com/55

 

[알고리즘 기본]Kruskal 알고리즘

Kruskal 알고리즘 MST(최소 신장 트리)를 구현하는 방법으로는 크루스칼 알고리즘과 프림 알고리즘이 있다. 오늘은 크루스칼 알고리즘에 대해 더 자세히 살펴보도록 하겠다. 크루스칼 알고리즘은

jinniepark.tistory.com

 

일단을 개념적으로 구하는 방법을 그려보았다.


예시)

 

 

초기 상태이다. 해당 정점을 방문했는지 체크할 visited배열과 가장 작은 가중치를 가질 Min_edge배열이 존재한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

하지만 위와 같은 방법으로 구현 할 때 인접해 있는 노드를 탐색하고 또 그 가중치를 비교하는 과정에서 정렬/비교를 하면 (주변 정점 수)-1번 만큼 연산이 이루어져야한다. 이는 많은 노드와 정점이 있다면 시간복잡도를 늘리는 원인이 된다.

따라서 실제 구현할때는 우선순위 큐를 사용해서 시간복잡도를 줄여야한다. 

 

아래에 우선순위 큐를 추가한 구현방법을 확인해보겠다.

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


관련문제

https://www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

https://jinniepark.tistory.com/47

 

[백준][1197]최소 스패닝 트리

/* 문제설명 */ 최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다. 입력 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선

jinniepark.tistory.com

 

+ Recent posts