일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 이분 탐색
- 가끔은 말로
- DP
- 플로이드 와샬
- 너비 우선 탐색
- 미래는_현재와_과거로
- dfs
- c++
- 문자열
- 가끔은_말로
- 크루스칼
- 2023
- lazy propagation
- 분할 정복
- dropout
- BFS
- tensorflow
- 회고록
- 조합론
- 다익스트라
- back propagation
- 우선 순위 큐
- NEXT
- pytorch
- 알고리즘
- Overfitting
- 세그먼트 트리
- object detection
- 백트래킹
- 자바스크립트
Archives
- Today
- Total
Doby's Lab
[알고리즘] 백준 1956번: 운동 (C++) 본문
https://www.acmicpc.net/problem/1956
사이클 최소 비용 경로 길이를 찾는 문제다.
플로이드 와샬을 사용하면 풀린다.
풀리는 이유는 플로이드 와샬을 이용하면 자기 자신을 향한 최소 비용 경로도 무조건 다른 노드를 거쳐서 할당되기 때문에 가능하다.
(물론 최소 비용 경로를 묻는 문제에서는 자기 자신을 향한 경로는 플로이드 와샬이 끝나고 0을 할당해줘야 함)
>> 플로이드 와샬의 특성을 이용하는 문제였다.
#include <iostream>
#include <cmath>
#define MAX 500 + 1
#define INF 987654321
using namespace std;
int graph[MAX][MAX];
int cache[MAX][MAX];
int n, m;
void floydWarshall() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cache[i][j] = graph[i][j];
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (cache[i][k] != INF && cache[k][j] != INF) {
cache[i][j] = min(cache[i][j], cache[i][k] + cache[k][j]);
}
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
graph[i][j] = INF;
}
}
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
graph[a][b] = c;
}
floydWarshall();
int minValue = INF;
for (int i = 1; i <= n; i++) {
minValue = min(minValue, cache[i][i]);
}
if (minValue == INF) cout << -1;
else cout << minValue;
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
[알고리즘] 백준 1613번: 역사 (C++) (0) | 2021.12.06 |
---|---|
[알고리즘] 백준 10159번: 저울 (C++) (0) | 2021.12.06 |
[알고리즘] 백준 2458번: 키 순서 (C++) (0) | 2021.12.06 |
[알고리즘] 백준 11404번: 플로이드 (C++), 플로이드 와샬 (0) | 2021.12.06 |
[알고리즘] 백준 5792번: 택배 배송 (C++) (0) | 2021.12.06 |