https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
문제 해결 과정
착안
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm)에 따라 문제에서 요구하는 도시 간 거리를 계산하고자 하였다. 음수 가중치 간선이 없기 때문에 일반적인 방법으로 문제를 해결하고자 하였다.
구현
알고리즘을 구현함에 있어서, 삼중 반복문의 루프 변수 배치 순서 및 시작 도시와 도착 도시 사이의 연결이 없는 경우를 0으로 표시하는 부분에 유의하여 프로그래밍 하였다.
[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~
더보기
#include <iostream>
using namespace std;
int D[100][100];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N, M;
cin >> N >> M;
while (M--)
{
int from, dest, cost;
cin >> from >> dest >> cost;
if (D[from - 1][dest - 1])
D[from - 1][dest - 1] = cost < D[from - 1][dest - 1] ? cost : D[from - 1][dest - 1];
else
D[from - 1][dest - 1] = cost;
}
for (int w = 0; w < N; w++)
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
if (i == j || w == i || w == j)
continue;
if (D[i][w] && D[w][j])
if (!D[i][j] ||
D[i][j] > D[i][w] + D[w][j])
D[i][j] = D[i][w] + D[w][j];
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
cout << D[i][j] << " ";
cout << "\n";
}
return 0;
}
실행 결과
'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글
[Baekjoon] 13305번: 주유소 (0) | 2023.07.28 |
---|---|
[Baekjoon] 16234번: 인구 이동 (0) | 2023.07.26 |
[Baekjoon] 2293번: 동전 1 (0) | 2023.07.24 |
[Baekjoon] 2447번: 별 찍기 - 10 (0) | 2023.07.24 |
[Baekjoon] 18405번: 경쟁적 전염 (0) | 2023.07.21 |
댓글