YoonWould!!

[다익스트라] 다익스트라 알고리즘 1 본문

<SW>/알고리즘 + 자료구조

[다익스트라] 다익스트라 알고리즘 1

Hading 2018. 10. 9. 00:46
728x90

다익스트라 알고리즘


=> 현재까지 알고 있던 최단 경로를 계속해서 갱신해 나가는 알고리즘



※이 문제 어떻게 풀지?


=> 아직까지는 힙을 사용하지 않음


1. 출발 노드 설정

2. 출발노드를 기준으로 각 노드의 최소 비용을 저장

3. 방문하지 않은 노드 중에서 가장 비용이 적은 노드 선택

4. 해당 노드를 거쳐서 특정한 노드로 가능 경우를 고려하여 최소 비용을 갱신

5.위 과정에서 3번 4번 반복



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
#include<stdio.h>
 
int number = 6;
int INF = 10000000;
 
//전체 그래프를 초기화 합니다.
 
int a[6][6= {
    {0,2,5,1,INF,INF},
    {2,0,3,2,INF,INF},
    {5,3,0,3,1,5},
    {1,2,3,0,1,INF},
    {INF,INF,1,1,0,2},
    {INF,INF,5,INF,2,0},
};
 
bool v[6]; // 방문한 노드입니다.
int d[6]; // 거리입니다.
 
//가장 최소 거리를 가지는 정점을 반환합니다.
int getSmallIndex(){
    int min = INF;
    int index = 0;
    // 방문되지 않았고 거리 작은거
    for (int i = 0; i < number; i++) {
        if (d[i] < min && !v[i]) {
            min = d[i];
            index = i;
        }
    }
    return index;
}
void dijkstra(int start) {
    for (int i = 0; i < number; i++) {
        d[i] = a[start][i];
    }
 
    v[start] = true;
    for (int i = 0; i < number - 2; i++) {
        int current = getSmallIndex();
        v[current] = true;
        for (int j = 0; j < 6; j++) {
            if (!v[j]) {
                if (d[current] + a[current][j] < d[j]) {
                    d[j] = d[current] + a[current][j];
                }
            }
        }
    }
}
int main() {
    dijkstra(0);
    for (int i = 0; i < number; i++) {
        printf("%d ", d[i]);
    }
    return 0;
}
cs


728x90

'<SW> > 알고리즘 + 자료구조' 카테고리의 다른 글

[BFS] 숨바꼭질 4  (0) 2018.10.16
다익스트라(우선순위 힙이용)  (0) 2018.10.16
[BFS,DFS] 2251번 물통  (0) 2018.10.09
[BFS,DFS] 2667번 단지번호붙이기  (0) 2018.10.08
[백트레킹] 2636번 치즈  (0) 2018.10.06