-
BOJ 1956: 운동알고리즘 2023. 7. 27. 18:13
#BOJ 1956: 운동
1956번: 운동
첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의
www.acmicpc.net
#풀이
플로이드알고리즘을 통해서 해결할 수 있다.
플로이드를 계속 풀어서 그런가 그냥 모든게 다 플로이드로 보인다 ㅋㅋㅋ
그냥 d[i][j] + d[j][i] 의 최솟값을 출력해주면 된다.
i ==j, d[i][j] == INF, d[j][i] == INF 일 때 생각해서 처리를 해야한다.
#코드
#include<bits/stdc++.h> using namespace std; int v, e; int d[401][401]; const int INF = 0x3f3f3f3f; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> v >> e; for(int i = 1; i <=v; i++){ fill(d[i] +1, d[i]+1+v,INF); d[i][i] = 0; } for(int i = 0; i < e; i++){ int a, b, c; cin >> a>> b>> c; d[a][b] = c; } for(int k = 1; k <=v; k++){ for(int i = 1; i <=v; i++){ for(int j = 1; j <=v; j++){ d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } int ans = 0x3f3f3f3f; for(int i = 1; i <=v; i++){ for(int j = 1; j <=v; j++){ if(i == j) continue; if(d[i][j] == INF) continue; if(d[j][i] == INF) continue; ans = min(ans, d[i][j] + d[j][i]); } } if(ans == INF) ans = -1; cout << ans << '\n'; return 0; }
'알고리즘' 카테고리의 다른 글
BOJ 1507: 궁금한 민호 (0) 2023.07.28 BOJ 11562: 백양로 브레이크 (0) 2023.07.27 BOJ 21940: 가운데에서 만나기 (0) 2023.07.27 BOJ 14938: 서강그라운드 (0) 2023.07.27 BOJ 11780 : 플로이드 2 (0) 2023.07.27