문제링크 : https://www.acmicpc.net/problem/11404
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int arr[101][101];
int N, M, a, b, c;
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
if(i!=j) arr[i][j]=MAX; //큰 수로 초기화
}
}
for(int i=0; i<M; i++)
{
cin >> a >> b >> c;
arr[a][b] = min(arr[a][b], c); //값 할당
}
for(int k=1; k<=N; k++)
{
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
arr[i][j] = min(arr[i][j], arr[i][k]+arr[k][j]); //플로이드 와샬 알고리즘
}
}
}
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
cout << (arr[i][j] == MAX ? 0 : arr[i][j]) << " "; //못가면 0, 갈 수 있으면 해당값
}
cout << "\n";
}
return 0;
}
플로이드 와샬알고리즘 문제이다.
여기서 도시 A -> B로 가는 모든 경우의 수에 대해서 최단값을 조사하기에 처음에 배열을 MAX로 초기화하고 시작한다.
이때 i==j일 경우 같은 곳이라서 비용이 없으므로 이때는 제외한다.
그 다음에 도시와 비용을 입력받고 맞는 비용을 할당해준다.
이후 플로이드 와샬 알고리즘을 이용하여 모든 경우의 수에 대해 값을 할당해준다.
만약 위 알고리즘을 돌렸는데, 값이 MAX 그대로라면 갈 수 없는 곳이기에 0을 출력하고 이외에는 알고리즘으로 구한 해당 값을 출력해준다.
'백준 > 골드' 카테고리의 다른 글
[백준 16236번] 아기 상어 (C++) (0) | 2023.04.14 |
---|---|
[백준 1753번] 최단경로 (C++) (0) | 2023.04.12 |
[백준 16118번] 달빛 여우 (C++) (0) | 2023.04.03 |
[백준 15942번] 전단지 돌리기 (C++) (0) | 2023.04.01 |
[백준 1615번] 교차개수세기 (C++) (0) | 2023.03.30 |