-
백준 1956 운동 - 플로이드-와샬, C++쾌락없는 책임 (공부)/알고리즘 문제풀이 2021. 6. 7. 11:25반응형
#include <iostream> #include <cstring> #include <algorithm> #define MAX 999999999 using namespace std; int v, e; int a, b, c; int road[401][401]; int res = MAX; void Floyd(){ for(int via = 1; via <= v; via++){ for(int from = 1; from <= v; from++){ if(road[from][via] == MAX) continue; for(int to = 1; to <= v; to++){ if(road[via][to] == MAX) continue; if(road[from][to] > road[from][via] + road[via][to]) road[from][to] = road[from][via] + road[via][to]; } } } } int main(){ for(int i = 0; i <= 400; i++){ for(int j = 0; j <= 400; j++){ road[i][j] = MAX; } } scanf("%d %d", &v, &e); while (e--){ scanf("%d %d %d", &a, &b, &c); road[a][b] = c; } Floyd(); for(int i = 1; i <= v; i++){ for(int j = 1; j <= v; j++){ if(i == j) continue; if(road[i][j] != MAX && road[j][i] != MAX) res = min(res, road[i][j] + road[j][i]); } } if(res == MAX) printf("-1\n"); else printf("%d", res); }
플로이드-와샬을 한 후 사이클이 있는걸 판단하는 문제입니다. 단순 플로이드 알고리즘들과 같은 랭크라 큰 어려움은 없는 문제입니다. 사이클을 판단하는 기준은 'a->b 경로가 있고 b-> a 경로가 있는 경우'이며 위 코드에서는
if(road[i][j] != MAX && road[j][i] != MAX) res = min(res, road[i][j] + road[j][i]);
이 부분이 해당이 됩니다. 혹시 사이클이 있다면 res에 최소 사이클을 넣어줌으로서 답을 찾아낼 수 있습니다.
반응형'쾌락없는 책임 (공부) > 알고리즘 문제풀이' 카테고리의 다른 글
백준 2166 다각형의 면적 - C++, 벡터의 내적 (0) 2021.06.11 백준 9446 텀 프로젝트 - C++, DFS (0) 2021.06.10 백준 10282 해킹 - C++, 다익스트라 (0) 2021.06.06 백준 5719 거의 최단 경로 - C++, 다익스트라, BFS (0) 2021.06.05 백준 6165 Cow Contest - C++, 플로이드-와샬 (0) 2021.06.04