문제 링크 : https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우는 없다. 비용은 100,000보다 작거나 같은 자연수이다. 시작
www.acmicpc.net
문제 설명
1. 도시의 갯수가 주어지고 그다음 줄에는 버스의 갯수가 주어짐
2. 그리고 그다음줄에 도시간 이동시 드는 버스비가 주어진다.
3. 각 도시에 다른도시로 이동하는 최소비용을 배열형식으로 출력.
알고리즘
1.제목부터 플로이드이다. 플로이드 와샬 알고리즘 사용해서풀면쉽게 풀린다 .
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<iostream> #include<algorithm> using namespace std; int main() { cin.tie(NULL); ios::sync_with_stdio(false); int N, M, map[101][101]; cin >> N >> M; //배열 초기화 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j)map[i][j] = 0; else map[i][j] = 1000000000; } } //간선 정보 for (int j = 0; j < M; j++) { int a, b, c; cin >> a >> b >> c; map[a - 1][b - 1] = min(map[a - 1][b - 1], c); } //플로이드 와샬 알고리즘 for (int k = 0; k < N; k++) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { map[i][j] = min(map[i][j], map[i][k] + map[k][j]); } } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (map[i][j] == 1000000000) map[i][j] = 0; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << map[i][j] << " "; } cout << "\n"; } } | cs |
'c++ > 백준' 카테고리의 다른 글
백준 2458번 : 키 순서 (0) | 2020.04.30 |
---|---|
백준 1507번: 궁금한 민호 (0) | 2020.04.30 |
백준 3015번 : 오아시스 재결합 (0) | 2020.04.29 |
백준 1613번: 역사 (0) | 2020.04.29 |
백준 1722번 : 순열의 순서 (0) | 2020.04.29 |