문제풀이/백준oj
[백준OJ] 1956번 운동
Hyeon-Uk
2021. 5. 7. 22:17
반응형
1956번: 운동
첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의
www.acmicpc.net
-풀이-
플로이드 와샬 알고리즘을 이용하여 모든 도시에서 모든 도시로의 최소거리를 구해준다. 이때 사이클이 생기는것도 허용해야 하므로, i==j 일때 continue하는 조건을 삭제해준다.
알고리즘을 실행시킨 뒤, 자기가 있는 도시부터 자기가있는 도시까지의 거리중 최솟값( maze[i][i] , i는 1~V까지,) 를 구한다.
-시간복잡도-
플로이드와샬의 시간복잡도는 O(V3)이 된다.
-코드-
#include<iostream>
#include<algorithm>
#define MAX 987654321
using namespace std;
int maze[401][401];
int v, e;
int main() {
cin >> v >> e;
for (int i = 1; i <= v; i++)
for (int j = 1; j <= v; j++)
maze[i][j] = MAX;
for (int i = 0; i < e; i++) {
int a, b, c;
cin >> a >> b >> c;
maze[a][b] = c;
}
for (int k = 1; k <= v; k++) {
for (int i = 1; i <= v; i++) {
for (int j = 1; j <= v; j++) {
if(i==k||j==k) continue;
if (maze[i][j] > maze[i][k] + maze[k][j]) {
maze[i][j] = maze[i][k] + maze[k][j];
}
}
}
}
int result = MAX;
for (int i = 1; i <= v; i++) {
result = min(result, maze[i][i]);
}
if (result == MAX) {
cout << "-1\n";
}
else {
cout << result << "\n";
}
return 0;
}
반응형