https://www.acmicpc.net/problem/11404
이 문제는 플로이드 워셜 알고리즘을 다룬다
다익스트라는 하나의 점에서 부터 다른 vertex까지의 최단 경로를 구하는 것이라면
플로이드 워셜은 전체 점에서의 최단 경로를 구하는 문제이다
다익스트라 알고리즘의 경우 우선순위 큐에 계속 넣어서 경로의 최솟값들을 소모시키면서 다른 vertex들과의 비용을 업데이트 해줬다.
단 플로이드 워셜 알고리즘의 경우 모든 점을 업데이트 해줘야하므로 dp를 통해 순차 탐색을 진행해준다
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
}
핵심 로직은 이부분이다 K라는 경유점을 통해서 i to j 의 값과 기존에 i to j의 값을 비교해서 더작으면 넣어주는게 로직이다 .
#include <iostream>
#include <algorithm>
#define INF 987654321
using namespace std;
int n;
int dp[101][101];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
int m;
cin >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
dp[i][j] = 0;
else
dp[i][j] = INF;
}
}
for (int i = 0; i < m; i++) {
int from, to, cost;
cin >> from >> to >> cost;
dp[from][to] = min(dp[from][to], cost);
}
//k는 경유점
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dp[i][j] == INF) {
cout << 0 << ' ';
continue;
}
cout << dp[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
'백준(코테준비) > DP' 카테고리의 다른 글
백준 2225 / CPP (0) | 2024.08.15 |
---|---|
백준 5972 (0) | 2024.08.08 |
백준 2294/C++ (0) | 2024.08.01 |
백준 14284 (1) | 2024.07.25 |
백준 11054 (3) | 2024.07.25 |