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
[풀이 방법]
조건
- 일방 통행 edge
- 왕복하는 경우도 사이클로 포함
원하는 답
- 도로의 길이의 합이 가장 작은 사이클을 찾기
알고리즘 수업 들을 때, 교수님이 이건 그다지 좋지 않다고 했지만.. 생각하기는 편한 것 같다.
시작, 도착, 거치는 지점 모든 가능성을 다 해봐서
노드의 모든 연결점들의 길이를 구하는 것이다.
그리고 여기서는 사이클을 보기로 했으므로 [i][i] 중에서 최소 길이를 찾아서, 가장 작은 사이클을 구한다.
import sys
input = sys.stdin.readline
INF = sys.maxsize
V, E = map(int,input().split())
arr = [[INF] * V for _ in range(V)]
for _ in range(E):
s,e,w= map(int,input().split())
arr[s-1][e-1] = w
for k in range(V):#거침
for i in range(V): #시작
for j in range(V): #도착
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j])
ans = INF
for i in range(V):
ans = min(ans,arr[i][i]) #본인으로 돌아오는 것중에 최소
if ans == INF:
print(-1)
else:
print(ans)
'알고리즘 공부' 카테고리의 다른 글
[백준/그리디] 22993번 서든어택3 (0) | 2022.03.17 |
---|---|
[백준/세그먼테이션 트리] 10868번 최솟값 (0) | 2022.03.16 |
[백준/세그먼테이션 트리] 2357 최솟값과 최댓값 (0) | 2022.03.15 |
[백준/세그먼트트리] 2042번 구간 합 (0) | 2022.03.15 |
[백준/최소신장트리] 20010번 악덕 영주 혜유 (0) | 2022.03.13 |