백준 링크
https://www.acmicpc.net/problem/11404
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
1 초 | 256 MB | 60021 | 25284 | 17808 | 41.631% |
문제
n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다.
모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우는 없다. 비용은 100,000보다 작거나 같은 자연수이다.
시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.
출력
n개의 줄을 출력해야 한다. i번째 줄에 출력하는 j번째 숫자는 도시 i에서 j로 가는데 필요한 최소 비용이다. 만약, i에서 j로 갈 수 없는 경우에는 그 자리에 0을 출력한다.
예제 입력 1
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
3 4 2
5 2 4
예제 출력 1
0 2 3 1 4
12 0 15 2 5
8 5 0 1 1
10 7 13 0 3
7 4 10 6 0
코드 풀이
가장 기본적인 플로이드 알고리즘을 활용한 풀이
플로이드 워셜 알고리즘이란 모든 노드에서 다른 모든 노드까지의 최단 경로를 구하고자 할 때 사용하는 알고리즘입니다.
- 그래프 벡터 INF로 초기화
- 그래프의 각 시작 노드(1,1) (2,2)와 같은 노드는 0으로 초기화(본인이 본인한테 가는 가격은 0)
- 나머지 노드는 입력으로 주어진 값 대입
- 플로이드 알고리즘 실행
- 최종적인 Graph벡터 원소값(코스트 값) 출력
코드
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define INF 1000000000
int N, M;
int main()
{
cin >> N;
cin >> M;
vector<vector<int>> Graph(N + 1, vector<int>(N + 1, INF));
int CityA, CityB, Cost;
for (int i = 1; i <= N; ++i)
{
Graph[i][i] = 0;
}
for (int i = 0; i < M; ++i)
{
cin >> CityA >> CityB >> Cost;
// 기존에 저장된 값이 입력으로 주어진 Cost보다 크다면 갱신
if (Graph[CityA][CityB] > Cost)
Graph[CityA][CityB] = Cost;
}
for (int k = 1; k <= N; ++k)
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
Graph[i][j] = min(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;
}
이번 문제를 푸니깐 골드 랭크가 됐다 뿌듯..
'백준' 카테고리의 다른 글
백준 : 1956번 운동 플로이드 와샬(c++) (0) | 2023.09.05 |
---|---|
백준 : 14938번 서강그라운드 플로이드 와샬(c++) (0) | 2023.09.03 |
백준 : 11779번 최소비용 구하기2 다익스트라(c++) (1) | 2023.08.30 |
백준 : 17835번 면접보는 승범이네 다익스트라(c++) (1) | 2023.08.26 |
백준 : 1753번 최단경로 다익스트라 (c++) (0) | 2023.08.25 |
댓글