PS

BOJ 11404 - 플로이드

728x90

www.acmicpc.net/problem/11404

 

11404번: 플로이드

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

www.acmicpc.net

플로이드 와샬 알고리즘은

그래프 상에서 모든 정점 쌍 사이에 최단거리를 갱신하는 알고리즘으로,

O(V^3) 의 시간 복잡도를 갖는 알고리즘이다 (V 는 노드의 갯수)

 

플로이드 와샬 알고리즘의 핵심은 

정점 A 에서 B 로 가는 최단거리를 구하되, 중간에 거쳐가는 다른 정점 C 를 거쳐가면

A 에서 B 로 가는 최단거리가 더 줄어 들 수 있느냐 이다.

 

플로이드 와샬 알고리즘의 특징은

음의 가중치를 갖는 그래프에서도 가능하며 (이때는 다익스트라 대신 사용가능)

음의 가중치에서 처리 가능한 벨만 포드 알고리즘에 비해서 시간복잡도가 우위에 있다는 특징이 있다.

 

- c++

 

#include <algorithm>
#include <iostream>
 
#define INF 1e9
#define MAX 100
 
using namespace std;
 
int n, m;
int dist[MAX][MAX];
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> n >> m;
    
    for (int i = 0; i < n; ++i) 
        for (int j = 0; j < n; ++j) 
            dist[i][j] = i == j ? 0 : INF;
 
    for (int i = 0; i < m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        dist[a - 1][b - 1= min(dist[a - 1][b - 1], c);
    }
    
    for (int k = 0; k < n; ++k) 
        for (int i = 0; i < n; ++i) 
            for (int j = 0; j < n; ++j) 
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (dist[i][j] == INF) cout << 0 << " ";
            else cout << dist[i][j] << " ";
        }
        cout << "\n";
    }
    
    return 0;
}
cs

 

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 5430 - AC  (0) 2020.12.16
BOJ 11403 - 경로 찾기  (0) 2020.12.15
BOJ 15685 - 드래곤 커브  (0) 2020.12.15
BOJ 11286 - 절댓값 힙  (0) 2020.12.14
BOJ 15684 - 사다리 조작  (0) 2020.12.14