플로이드 - 와샬 알고리즘

2020. 10. 19. 11:35·알고리즘

플로이드 와샬 알고리즘은 다익스트라, 벨만 포드 알고리즘과 달리 '모든 정점에서 다른 정점까지의 최단거리'를 구한다.

 

다익스트라처럼 큐에 넣어서 거쳐가는 지점을 뽑아 쓰는 것과 달리 플로이드 와샬은

거쳐가는 지점을 중심으로 해서 다시 모든 노드를 탐색한다. 따라서 시간 복잡도는 \(O(N^3)\) 이 걸린다.

 

www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 �

www.acmicpc.net

 

문제 풀이를 통해 알아보면 시간 복잡도가 높은 만큼 입력 범위는 작게 100으로 주어진다.

 

	for (int k = 0; k < n; k++) { //k = 거처가는 노드
		for (int i = 0; i < n; i++) { // i = 시작 노드
			for (int j = 0; j < n; j++) { // j = 도착 노드
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
				//i -> j = min(시작 -> 도착, 시작 -> 거처가는 노드 + 거처가는 노드 -> 도착 노드)
			}
		}
	}

 

놀랍지만 저 코드가 플로이드 와샬 알고리즘을 나타낸다. 

중간에 거쳐가는 모든 노드에 대해 각 정점들을 전부 탐색하다 보니 다익스트라는 1차원 배열을 사용하지만

플로이드 와샬은 2차원 배열을 사용하여 i -> j로 가는 최단거리를 모두 나타낸다.

 

다익스트라나 벨만 포드와 달리 모든 정점을 INF로 초기화하지 않고 i == j 인 부분에 대해 0으로 처리해준다.

 

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			d[i][j] = i == j ? 0 : INF;
		}
	}

 

자기 자신으로 가는 최단거리는 0이므로 d [i][i]인 모든 부분을 0으로 초기화해줘야 한다.

 

#include <iostream>
using namespace std;

const int INF = 1e9;
int d[101][101];
int n, m, a, b, c;

int min(int a, int b) { return a > b ? b : a; }

int main() {
	ios::sync_with_stdio(false); cin.tie(0);

	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			d[i][j] = i == j ? 0 : INF;
		}
	}

	for (int i = 0; i < m; i++) {
		cin >> a >> b >> c;
		d[a - 1][b - 1] = min(d[a - 1][b - 1], c);
	}

	for (int k = 0; k < n; k++) { //k = 거처가는 노드
		for (int i = 0; i < n; i++) { // i = 시작 노드
			for (int j = 0; j < n; j++) { // j = 도착 노드
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
				//i -> j = min(시작 -> 도착, 시작 -> 거처가는 노드 + 거처가는 노드 -> 도착 노드)
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (d[i][j] >= INF) cout << 0 << ' ';
			else cout << d[i][j] << ' ';
		}
		cout << '\n';
	}

	return 0;
}

 

'알고리즘' 카테고리의 다른 글

소수 구하기  (0) 2020.12.09
벨만 - 포드 알고리즘  (0) 2020.10.18
유니온 파인드(Union-Find)  (0) 2020.10.15
순열과 조합  (0) 2020.10.02
다익스트라 알고리즘  (0) 2020.09.24
'알고리즘' 카테고리의 다른 글
  • 소수 구하기
  • 벨만 - 포드 알고리즘
  • 유니온 파인드(Union-Find)
  • 순열과 조합
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    팰린드롬
    SWEA
    알고리즘
    크루스칼
    dp
    이분 탐색
    BFS
    냅색
    분할 정복
    유니온 파인드
    완전탐색
    이분탐색
    행렬 제곱
    완전 탐색
    조합
    dfs
    피보나치 수
    MST
    GREEDY
    코딩테스트 연습
    BOJ
    트리
    소수
    우선순위 큐
    시뮬레이션
    큐
    피사노 주기
    프로그래머스
    구현
    다익스트라
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
플로이드 - 와샬 알고리즘
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.