그래프 - Floyd 알고리즘

2022. 1. 31. 18:09·자료구조
728x90
반응형

# [C언어로 쉽게 풀어쓴 자료구조(천인국)]를 공부하고 주요 내용을 정리하고자 작성하는 글입니다.

# 해당 게시글에 대한 모든 피드백 환영합니다. 


Floyd 알고리즘

그래프에 존재하는 모든 정점 사이의 최단 경로를 한번에 모두 찾아주는 알고리즘

 

Dijkstra 알고리즘에서는 '하나의 정점'에서 '다른 모든 정점'으로의 최단 경로를 찾았다면,

Floyd 알고리즘에서는 '모든 정점'에서 '모든 정점'으로의 최단 경로를 구할 수 있다. 

 

즉, 그래프의 모든 정점에 대한 최단 경로쌍을 구할 수 있다.

 

이 알고리즘의 핵심 원리는 '거쳐가는 정점'을 기준으로 최단 경로를 구한다. 

 

알고리즘

1
2
3
4
5
floyd(G):
    for k<-0 to n-1
        for i<-0 to n-1
            for j<-0 to n-1
                A[i][j] = min(A[i][j], A[i][k] + A[k][j])
cs

생각의 순서

1. 하나의 정점에서 다른 정점으로 갈 때, 바로 갈 수 있으면 '기존 인접행렬 값'으로, 바로 갈 수 없으면 '무한'으로 배열에 값을 저장한다.

2. 3중 for문을 통해 거쳐가는 정점을 설정한 후, 특정 정점을 거칠 때 비용이 줄어드는 경우에는 배열의 값을 변경한다.

3. 위의 과정을 반복해 모든 정점 사이의 최단 경로를 탐색한다.

 

이를 c언어로 구현해보고, 모니터링을 통해 이해해보면 좋을 것 같다.

 

c언어로 구현

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define def_floyd
 
#ifdef def_floyd
 
#include <stdio.h>
#include <stdlib.h>
 
#define TRUE 1
#define FALSE 0
 
#define MAX_VERTICES 50
#define INF 999
 
typedef struct GraphType {
    int n;
    int weight[MAX_VERTICES][MAX_VERTICES];
} GraphType;
 
int A[MAX_VERTICES][MAX_VERTICES];
 
void printA(GraphType* g) {
    int i, j;
 
    printf("=============================\n");
    for (i = 0; i < g->n; i++)
    {
        for (j = 0; j < g->n; j++)
        {
            if (A[i][j] == INF) {
                printf(" * ");
            } else {
                printf("%3d", A[i][j]);
            }
        }
        printf("\n");
    }
    printf("=============================\n");
}
 
void floyd(GraphType* g) {
    int i, j, k;
 
    for (i = 0; i < g->n; i++) {
        for (j = 0; j < g->n; j++) {
            A[i][j] = g->weight[i][j];
        }
    }
    printA(g);
 
    for (k = 0; k < g->n; k++)
    {
        for (i = 0; i < g->n; i++)
        {
            for (j = 0; j < g->n; j++)
            {
                if (A[i][j] > A[i][k] + A[k][j])
                    A[i][j] = A[i][k] + A[k][j];
            }
        }
        printA(g);
    }
}
int main()
{
    GraphType g = { 4,
        {{0, 5, INF, 8},
        {7, 0, 9, INF},
        {2, INF, 0, 4},
        {INF, INF, 3, 0}
        }
    };
    floyd(&g);
    return 0;
}
#endif
Colored by Color Scripter
cs

결과

시간복잡도

O(n^3)

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'자료구조' 카테고리의 다른 글

트리 - 개념/ 용어정리  (0) 2022.02.01
그래프 - 위상정렬  (1) 2022.01.31
그래프 - Dijkstra 알고리즘  (0) 2022.01.31
그래프 - 최단경로  (0) 2022.01.31
그래프 - Prim의 MST 알고리즘  (0) 2022.01.31
'자료구조' 카테고리의 다른 글
  • 트리 - 개념/ 용어정리
  • 그래프 - 위상정렬
  • 그래프 - Dijkstra 알고리즘
  • 그래프 - 최단경로
heeya16
heeya16
개발 공부 냠냠
  • heeya16
    개발자 희야
    heeya16
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • 코딩테스트 (66)
        • 프로그래머스 (38)
        • SWEA (2)
        • BAEKJOON (26)
      • 알고리즘 (7)
      • 자료구조 (19)
      • 프로젝트 (5)
      • 취업 주르륵 (3)
      • 데이터베이스 (0)
      • IT지식 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    1003
    10448
    10773
    10월
    10진수
    11047
    11399
    11403
    11866
    1449
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
heeya16
그래프 - Floyd 알고리즘
상단으로

티스토리툴바