※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1956번 문제인 운동이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1956
1956번: 운동
첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의
www.acmicpc.net
방향그래프의 각 점에서 자기자신으로 가는 최단거리 사이클을 모두 구하는 문제는 플로이드-워셜(Floyd-Warshall) 알고리즘을 이용하여 간단히 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int dist[401][401];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, E; cin >> N >> E;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
dist[i][j] = 11111111;
}
}
while (E--) {
int x, y, w; cin >> x >> y >> w;
dist[x][y] = w;
}
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
int ans = 11111111;
for (int k = 1; k <= N; k++) {
ans = min(ans, dist[k][k]);
}
if (ans == 11111111) cout << -1;
else cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2482 // C++] 색상환 (0) | 2021.08.20 |
---|---|
[BOJ 12970 // C++] AB (0) | 2021.08.19 |
[BOJ 1990 // C++] 소수인팰린드롬 (0) | 2021.08.17 |
[BOJ 1969 // C++] DNA (0) | 2021.08.16 |
[BOJ 20136 // C++] 멀티탭 스케줄링 2 (0) | 2021.08.15 |