일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- NEXT
- 우선 순위 큐
- 너비 우선 탐색
- 문자열
- c++
- 세그먼트 트리
- tensorflow
- 가끔은 말로
- 플로이드 와샬
- 분할 정복
- Overfitting
- 2023
- DP
- object detection
- 알고리즘
- dfs
- 다익스트라
- BFS
- pytorch
- 자바스크립트
- 백트래킹
- 조합론
- dropout
- 회고록
- lazy propagation
- 크루스칼
- 이분 탐색
- back propagation
- 가끔은_말로
- 미래는_현재와_과거로
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 |