득이공간

[백준 C++] 11404 플로이드 - 플로이드워셜 본문

PS/알고리즘 문제풀이

[백준 C++] 11404 플로이드 - 플로이드워셜

쟁득 2024. 2. 2. 16:37
 

11404번: 플로이드

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

www.acmicpc.net

cpp
#include <iostream> #include <vector> #include <climits> using namespace std; const int& Infinite = INT_MAX; vector<vector<int>> Distance; void FloydWarshall(int N) { for (int K = 0; K < N; ++K) { ‌‌for (int Start = 0; Start < N; ++Start) ‌‌{ ‌‌‌for (int End = 0; End < N; ++End) ‌‌‌{ ‌‌‌‌if (Distance[Start][K] == Infinite ‌‌‌‌‌|| Distance[K][End] == Infinite) ‌‌‌‌{ ‌‌‌‌‌continue; ‌‌‌‌} ‌‌‌‌Distance[Start][End] = min(Distance[Start][End], Distance[Start][K] + Distance[K][End]); ‌‌‌} ‌‌} } } int main() { ‌ios::sync_with_stdio(false); ‌cin.tie(NULL); ‌cout.tie(NULL); int N, M; ‌cin >> N >> M; ‌Distance.reserve(N); for (int i = 0; i < N; ++i) { ‌‌Distance.emplace_back(vector<int>(N, Infinite)); ‌‌Distance[i][i] = 0; } for (int i = 0; i < M; ++i) { ‌‌int Start, End, Weight; ‌‌cin >> Start >> End >> Weight; ‌‌Distance[Start - 1][End - 1] = min(Distance[Start - 1][End - 1], Weight); } FloydWarshall(N); for (const vector<int>& Row : Distance) { ‌‌for (const int& Weight : Row) ‌‌{ ‌‌‌if (Weight == Infinite) ‌‌‌{ ‌‌‌‌cout << 0; ‌‌‌} ‌‌‌else ‌‌‌{ ‌‌‌‌cout << Weight; ‌‌‌} ‌‌‌cout << ' '; ‌‌} ‌‌cout << '\n'; } }

플로이드-워셜 알고리즘 문제입니다.

중요 포인트는 다음과 같습니다.

 

1. 버스 정보를 입력 받을 때 이미 값이 존재하면 둘 중에 작은 값을 저장한다.

2. 점화식 업데이트 시 경유지로 갈 수 없는 경우를 패스한다.