https://www.acmicpc.net/problem/1719
이 문제는 m 으로 입력받아야하는데 n으로 입력받아서 로직으로는 맞는데 계속 틀린값이 나와서 멘탈나갈뻔했다 일단 이문제는 그냥 이제 i->j 로갈때의 첫번째 노드를 저장해놓는 배열을 따로 만들어 놓고 해당 배열을 통해 지속적으로 업데이트 해주면 되는 문제였다
#include <iostream>
using namespace std;
#define INF 200000000
// 여기는 경로 코스트 저장
int arr[201][201];
// 여기는 j로 가는 가장 먼저 방문해야 할 곳 저장
int arr2[201][201];
int n, m;
int main() {
cin >> n >> m;
int t1, t2, t3;
// 거리 배열 초기화
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
arr[i][j] = 0;
}
else {
arr[i][j] = INF;
arr2[i][j] = j; // 초기 방문 노드를 j로 설정
}
}
}
// 간선 정보 입력
for (int i = 1; i <= m; i++) {
cin >> t1 >> t2 >> t3;
arr[t1][t2] = t3;
arr[t2][t1] = t3;
arr2[t1][t2] = t2;
arr2[t2][t1] = t1;
}
// 플로이드-워셜 알고리즘
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (arr[i][j] > arr[i][k] + arr[k][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
arr2[i][j] = arr2[i][k]; // i -> j로 가는 첫 방문 노드 업데이트
}
}
}
}
// 결과 출력
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) cout << "- ";
else cout << arr2[i][j] << " ";
}
cout << endl;
}
return 0;
}
'백준(코테준비) > DP' 카테고리의 다른 글
백준 9370 / 다익스트라 / C++ (0) | 2025.02.20 |
---|---|
백준 1937 / C++ / dp (0) | 2025.02.07 |
백준 1562 / C++ / DP / 비트마스킹 (0) | 2025.02.07 |
백준 9252 / C++ / Dp (0) | 2025.01.24 |
백준 17404 / CPP / Dp (0) | 2025.01.16 |