자료구조 알고리즘(C++)/플로이드-와샬
[C++]백준(BOJ) - 11403 경로 찾기(플로이드-와샬)
SL123
2024. 10. 28. 12:25
난이도 : 실I
알고리즘 유형 : 플로이드-와샬
풀이 방법 : 3중 for문
문제 링크
https://www.acmicpc.net/problem/11403
이 문제는 플로이드-와샬의 기본 문제이며, 입력에 인접 행렬이 주어지고 최단경로는 구하는 문제입니다.
그리고 N이 100이 최대라는 점에서 인접 행렬 + 최단경로 = 플로이드 라는 것을 알 수 있습니다.
플로이드는 3중 for문으로 만들었으며 주의 사항은 최단경로이기 때문에 경로가 없는 지점은 0이 아닌 최대값을 넣어야합니다. 저같은 경우는 0x3f3f3f3f + 0x3f3f3f3f 가 overflow가 발생하지 않도록 최대값을 넣어주었습니다.
#include <bits/stdc++.h>
using namespace std;
int n;
const int inf = 0x3f3f3f3f;
int board[101][101];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> board[i][j];
if(!board[i][j])
board[i][j] = inf;
}
}
for(int k = 0; k < n; ++k)
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if(board[i][j] > board[i][k] + board[k][j])
board[i][j] = board[i][k] + board[k][j];
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << (board[i][j] != inf) << ' ' ;
}
cout << '\n';
}
}