-
백준 1507 궁금한 민호 | 플로이드-워셜 | C++[백준 알고리즘]/[C++] 2021. 5. 14. 10:04728x90반응형
이번 포스팅은 백준 1507번 궁금한 민호입니다.
아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.
https://www.acmicpc.net/problem/1507
기본 알고리즘
플로이드-워셜 알고리즘 Floyd-Warshall Algorithm
전체 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566//백준1507 궁금한 민호#include <iostream>using namespace std;const int MAX = 21;const int INF = 9999999;int N;int map[MAX][MAX];bool road[MAX][MAX];bool isImpossible; //불가능한 경우void reverse_floyd() {for (int k = 1; k <= N; k++) {for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {if (k == i || i == j || j == k) //서로 다른 두 도시의 경우에서만continue;if (map[i][j] > map[i][k] + map[k][j]) {//플로이드 알고리즘의 결과가 아님//i-j시간이 최소가 아님, k 거쳐가면 시간이 단축되는 경우 존재isImpossible = true;return;}else if (map[i][j] == map[i][k] + map[k][j]) {road[i][j] = false; //direct 경로가 아니면 i-j연결도로 삭제}}}}}int main() {cin >> N;for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {road[i][j] = true; //모든 도시는 연결되어 있음}}for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {cin >> map[i][j];}}reverse_floyd();int ans = 0; //모든 도로의 시간의 합for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {if (road[i][j] == true) { //i-j direct도로가 있으면ans += map[i][j];}}}ans /= 2; //i-j 시간과 j-i 시간이 중복 계산되어있으므로 2로 나눠줌if (isImpossible)cout << -1;elsecout << ans;return 0;}cs 728x90반응형'[백준 알고리즘] > [C++]' 카테고리의 다른 글
백준 11728 배열 합치기 | C++ (0) 2021.05.19 백준 2075 N번째 큰 수 | 우선순위 큐 | C++ (0) 2021.05.17 백준 15723 n단 논법 | 플로이드-워셜 | C++ (0) 2021.05.14 백준 1956 운동 | 플로이드-워셜 | C++ (0) 2021.05.12 백준 11000 강의실 배정 | 우선순위큐 | C++ (0) 2021.05.11