[알고리즘 이론] Floyd Warshall 플로이드 와샬 알고리즘 C++

2022. 2. 22. 16:07·알고리즘 이론

Floyd Warshall이란?

 

대표적인 최단거리 찾기 알고리즘 중 하나

- 다익스트라, 벨만포드, 플로이드 와샬

 * 다익스트라 : 모든 쌍의 최단 경로(음의 가중치 X)

 * 벨만포드 : 모든 정점에 대한 최단경로(음의 가중치 O)

 * 플로이드 와샬(음의 가중치 O + 음의  사이클이 없어야한다)

모든 정점끼리의 최단거리를 한번에 계산할 때 사용 + 동적 계획법을 사용

ex) 전체 정점에서 다른 정점들까지의 최단거리를 한번에 계산

-> 다익스트라의 경우 어떤 정점 A에서 다른 정점들까지의 최단 거리를 계산

 

 

Pseudo Code

for(k=1;k<=n;k++) //거쳐가는 노드
for(i=1;i<=n;i++) //출발 노드
for(j=1;j<=n;j++) //도착 노드
    D[i][j]=min(D[i][k]+D[k][j], D[i][j])

기존의 i 정점부터 j정점까지 이동했던 경로와 (i정점부터 k정점까지의 최단 경로) + (k정점부터 j정점까지의 최단 경로) 중 최소값을 저장

 


시간 복잡도

3중 for문을 사용하므로 O(V^3)

 

 

Floyd Warshall 예제 코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

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

	int N;
	cin >> N;
	int M;
	cin >> M;
	vector<vector<int>> dis(N+1,vector<int>(N+1,5000));
	for (int i = 1; i <= N; i++) {
		dis[i][i] = 0;
	}
	


	for (int i = 0; i < M; i++) {
		int from, to ,c;
		cin >> from >> to >> c;
		dis[from][to] = c;
	
	}

	for (int k = 1; k <= N; k++) {
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}

	for (int i = 1; i < N; i++) {
		for (int j = 1; j < N; j++) {
			cout << dis[i][j] << " ";
		}
		cout << "\n";
	}

}

 

 

 

 

 

저작자표시 비영리 (새창열림)

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

[순열] 순열 구현하기 C++  (0) 2022.03.06
[이론] 이진탐색 (Binary Search) - c++  (2) 2022.02.09
STL 컨테이너 별 사용도  (0) 2022.01.05
[알고리즘 이론] 정렬 알고리즘  (2) 2021.06.21
[알고리즘 이론] 시간 복잡도  (1) 2021.06.21
'알고리즘 이론' 카테고리의 다른 글
  • [순열] 순열 구현하기 C++
  • [이론] 이진탐색 (Binary Search) - c++
  • STL 컨테이너 별 사용도
  • [알고리즘 이론] 정렬 알고리즘
senyalog
senyalog
개발 블로그 https://github.com/iamyunjuda
  • senyalog
    Senya의 개발 블로그
    senyalog
  • 전체
    오늘
    어제
    • 분류 전체보기 (71)
      • 일상 (6)
      • 알고리즘 이론 (14)
        • 백준 (8)
      • 개발 (31)
        • Server (8)
        • 인턴 (2)
        • Javascript (0)
      • 경제 (7)
  • 블로그 메뉴

    • Github
    • 홈
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    공부
    백준풀이
    백준
    개발
    개발자
    인턴
    공대생
    코딩테스트
    TypeScript
    일상
    대학생
    알고리즘
    컴공
    알고리즘공부
    MSA
    이마고웍스
    암호화페
    GIT
    카페
    생각
    깃
    코딩
    개발공부
    대학생인턴
    nestjs
    서버
    백준문제
    인턴생활
    경제
    백엔드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
senyalog
[알고리즘 이론] Floyd Warshall 플로이드 와샬 알고리즘 C++
상단으로

티스토리툴바