반갑습니다!

[백준] 1956 운동 본문

알고리즘 문제 풀이

[백준] 1956 운동

김덜덜이 2020. 11. 26. 13:34
1956번: 운동
 
boj.kr

풀이

도로 길이의 합이 가장 작은 사이클을 찾는 문제이다. V가 400 이하이기 때문에 플로이드-와샬 알고리즘을 사용하면 쉽게 해결할 수 있다.

코드

C++

#include <iostream>
#define MAX 2e9
using namespace std;
int v, e;
int adj[401][401];
int main() {
cin >> v >> e;
// 최대값으로 초기화
for (int i = 1; i <= v; i++)
for (int j = 1; j <= v; j++)
adj[i][j] = MAX;
for (int i = 0; i < e; i++) {
int a, b, c;
cin >> a >> b >> c;
adj[a][b] = c;
}
// 플로이드 와샬 알고리즘
for (int k = 1; k <= v; k++) {
for (int i = 1; i <= v; i++) {
for (int j = 1; j <= v; j++) {
// i->k, k->j 의 경로가 있고, i->k->j로 이동하는 경로가 i->j 이동 경로보다 비용이 작은 경우
if (adj[i][k] != MAX && adj[k][j] != MAX && adj[i][k] + adj[k][j] < adj[i][j])
adj[i][j] = adj[i][k] + adj[k][j];
}
}
}
int ans = MAX;
for (int i = 1; i <= v; i++)
if (ans > adj[i][i])
ans = adj[i][i];
if (ans == MAX) cout << "-1\n";
else cout << ans << '\n';
return 0;
}
view raw 1956.cpp hosted with ❤ by GitHub

'알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 1275 커피숍2  (0) 2020.11.29
[백준] 10999 구간 합 구하기 2  (0) 2020.11.29
[백준] 2075 N번째 큰 수  (0) 2020.11.08
[프로그래머스] 내적  (0) 2020.11.07
[백준] 2959 거북이  (0) 2020.11.04