728x90
SMALL
백준 문제 풀이: 11404 [플로이드]
문제 링크: https://www.acmicpc.net/problem/11404
문제 설명:
n개의 도시와 도시를 연결하는 m개의 버스가 주어질 때, 모든 도시 간의 최소 비용을 구하는 문제입니다. 주어진 입력은 방향 그래프이며, 간선의 가중치가 존재합니다. 출력은 도시 i에서 도시 j로 이동하는 데 드는 최소 비용을 나타내는 n × n 행렬입니다. 만약 갈 수 없다면 0을 출력합니다.
입력:
- 첫 번째 줄에 도시의 개수
n
(2 ≤n
≤ 100)이 주어집니다. - 두 번째 줄에 버스의 개수
m
(1 ≤m
≤ 100,000)이 주어집니다. - 다음
m
개의 줄에는 출발 도시, 도착 도시, 비용이 주어집니다.
출력:
- i에서 j로 가는 최소 비용을 나타내는 n × n 행렬을 출력합니다. 갈 수 없는 경우는 0을 출력합니다.
문제 해결 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 1e9;
int graph[101][101];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
// 그래프 초기화
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
// 간선 정보 입력
for (int i = 0; i < m; i++) {
int a, b, cost;
cin >> a >> b >> cost;
graph[a][b] = min(graph[a][b], cost); // 동일 간선 중 최소 비용 선택
}
// 플로이드-워셜 알고리즘
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][k] + graph[k][j] < graph[i][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
// 결과 출력
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][j] == INF) {
cout << 0 << ' ';
} else {
cout << graph[i][j] << ' ';
}
}
cout << '\n';
}
return 0;
}
예제
입력:
5
14
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
3 5 10
3 1 8
1 4 2
5 1 7
5 2 4
4 5 1
출력:
0 2 3 1 4
12 0 15 2 5
8 5 0 1 1
10 7 13 0 1
7 4 10 1 0
코드 설명
- 그래프 초기화:
- 자기 자신으로 가는 비용은 0으로 설정하고, 다른 경로는 INF로 초기화합니다.
- 간선 정보 입력:
- 동일한 출발점과 도착점을 가지는 간선이 여러 개 주어질 수 있으므로 최소 비용만 저장합니다.
- 플로이드-워셜 알고리즘:
- 모든 정점 i, j에 대해 k를 경유하는 최소 비용을 계산합니다.
- 경유 비용이 기존 비용보다 작으면 업데이트합니다.
- 결과 출력:
- 도달 불가능한 경우 0을 출력하고, 가능한 경우 최소 비용을 출력합니다.
시간 복잡도
- 플로이드-워셜 알고리즘의 시간 복잡도는 O(n³)입니다.
- n의 최대값이 100이므로 106번 연산이 가능하며 효율적으로 동작합니다.
결과
코드는 모든 정점 간 최단 경로를 정확히 계산하며, 플로이드-워셜 알고리즘을 활용한 효율적인 풀이를 제공합니다. 입력 데이터에 따라 그래프 초기화와 간선 처리 과정을 적절히 구현하였습니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 11779번 [최소비용 구하기 2](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
---|---|
백준 11725번 [트리의 부모 찾기](C++)-yes6686- 티스토리 (1) | 2024.12.29 |
백준 5639번 [이진 검색 트리](C++)-yes6686- 티스토리 (0) | 2024.12.26 |
백준 2638번 [치즈](C++)-yes6686- 티스토리 (0) | 2024.12.26 |
백준 2206번 [벽 부수고 이동하기](C++) -yes6686- 티스토리 (0) | 2024.12.26 |