Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백트래킹
- 에라토스테네스의 체
- 문자열
- JUnit 5
- 알고리즘
- 구현
- Network
- 백준
- swea
- java
- 동적계획법
- 위상정렬
- 후니의 쉽게 쓴 시스코 네트워킹
- 프로그래머스
- 이분탐색
- 완전탐색
- 세그먼트 트리
- mst
- 시뮬레이션
- dfs
- 유니온 파인드
- 수학
- 투 포인터
- BFS
- 플로이드-와샬
- Kotlin
- CS
- 스택
- Effective Java
- 그리디
Archives
반갑습니다!
[백준] 1956 운동 본문
풀이
도로 길이의 합이 가장 작은 사이클을 찾는 문제이다. V가 400 이하이기 때문에 플로이드-와샬 알고리즘을 사용하면 쉽게 해결할 수 있다.
코드
C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#define MAX 2e9 | |
using namespace std; | |
int v, e; | |
int adj[401][401]; | |
int main() { | |
cin >> v >> e; | |
// 최대값으로 초기화 | |
for (int i = 1; i <= v; i++) | |
for (int j = 1; j <= v; j++) | |
adj[i][j] = MAX; | |
for (int i = 0; i < e; i++) { | |
int a, b, c; | |
cin >> a >> b >> c; | |
adj[a][b] = c; | |
} | |
// 플로이드 와샬 알고리즘 | |
for (int k = 1; k <= v; k++) { | |
for (int i = 1; i <= v; i++) { | |
for (int j = 1; j <= v; j++) { | |
// i->k, k->j 의 경로가 있고, i->k->j로 이동하는 경로가 i->j 이동 경로보다 비용이 작은 경우 | |
if (adj[i][k] != MAX && adj[k][j] != MAX && adj[i][k] + adj[k][j] < adj[i][j]) | |
adj[i][j] = adj[i][k] + adj[k][j]; | |
} | |
} | |
} | |
int ans = MAX; | |
for (int i = 1; i <= v; i++) | |
if (ans > adj[i][i]) | |
ans = adj[i][i]; | |
if (ans == MAX) cout << "-1\n"; | |
else cout << ans << '\n'; | |
return 0; | |
} |
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 1275 커피숍2 (0) | 2020.11.29 |
---|---|
[백준] 10999 구간 합 구하기 2 (0) | 2020.11.29 |
[백준] 2075 N번째 큰 수 (0) | 2020.11.08 |
[프로그래머스] 내적 (0) | 2020.11.07 |
[백준] 2959 거북이 (0) | 2020.11.04 |