알고리즘 :: 백준 :: 최단거리 :: 11404 :: 플로이드

Embedded June·2020년 9월 22일
0

알고리즘::백준

목록 보기
56/109

문제

n(1 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오.

문제접근

  • 모든 시작점에서 다른 모든 정점으로의 최단 경로를 구해야 하는 문제이므로 전형적인 플로이드 알고리즘 구현 문제다.
  • 플로이드 알고리즘은 O(n3)O(n^3)이 소요되는 알고리즘이므로 n = 100일 때도 충분히 1초내로 답을 구할 수 있다.
  • 플로이드 알고리즘의 핵심 알고리즘은 다음과 같다.
for (int 기준점 = 1; 기준점 <= n; ++기준점)
    for (int 시작점 = 1; 시작점 <= n; ++시작점)
    	for (int 도착점 = 1; 도착점 <= n; ++도착점)
            d[시작점][도착점] = min(d[시작점][도착점], d[시작점][기준점] + d[기준점][종료점]);
  • 시작점으로부터 도착점으로 가는 거리와 임의의 한 기준점을 거쳐서 가는 것 중 짧은 길이를 기록한다.

코드

// https://www.acmicpc.net/problem/11404
#include <iostream>
using namespace std;

static constexpr int MAX = 1e9 + 100; // 대충 큰 수
static int N, M, graph[501][501];

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	cin >> N >> M;	// N: 노드개수, M: 간선개수
	for (int i = 0; i < 501; ++i) {
		fill(graph[i], graph[i] + 501, MAX);
		graph[i][i] = 0;
	}
	for (int i = 1; i <= M; ++i) {
		int s, f, w;	cin >> s >> f >> w;
		if (graph[s][f] != MAX && graph[s][f] < w) continue;
		graph[s][f] = w;
	}
	for (int k = 1; k <= N; ++k)		 // k번째 노드에 대해 테이블 갱신
		for (int s = 1; s <= N; ++s)	 // 모든 출발 정점에 대해 반복
			for (int f = 1; f <= N; ++f) // 모든 도착 정점에 대해 반복
				graph[s][f] = min(graph[s][f], graph[s][k] + graph[k][f]);
	// 수행 결과를 출력함
	for (int s = 1; s <= N; ++s) {
		for (int f = 1; f <= N; ++f) {
			if (graph[s][f] == MAX) cout << 0 << ' ';
			else cout << graph[s][f] << ' ';
		}
		cout <<'\n';
	}
}

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글