일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Greedy
- 스택
- 더하기 시리즈
- 브루트포스
- 컴공
- 코딩
- 1
- 백트래킹
- DFS
- 수 정렬하기2
- 웹 페이지 입문
- 다이나믹 프로그래밍
- 오픽
- 백준풀이
- 11066
- 오늘의 계획
- DP
- ENFJ
- 3
- HTML
- 파이썬
- 12969
- 정렬
- BFS
- 구현
- 정규 표현식 #문자열
- Python
- knuth_optimization
- 백준
- 2
- Today
- Total
코딩하는 Fug
11657 타임머신 정리 본문
https://www.acmicpc.net/problem/11657
#bellman ford algorithm
11657번: 타임머신
첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다.
www.acmicpc.net
#bellman ford algorithm
간단히 말해서 다익스트라와 비슷한데 다른점은 start와 직접적으로 관련되지 않은 vertex까지 탐색함으로써 음수가 나
와서 start와 직접적으로 관련되있지 않더라도 연결되면 최소비용이 나오는 상황이 되었을때 사용되는 알고리즘이다. 어
떻게 되면 브루트포스와 비슷하다. 이유는 모든 간선을 모두 돌며 조건은 초기 설정한 cost[start]=0 제외한 n-1번 모든
간선을 최소비용을 찾으면서 도는 것이기 때문에 좀 무식한 알고리즘으로 볼 수있다. 따라서 시간역시 다익스트라가 훨
씬 빠르다. 하지만 음수가 가중치인 상황에서 쓸 수 있다는 점이 매력적인 알고리즘이다.
#code
#11657 타임머신 벨만포드
import sys
input=sys.stdin.readline
def bellmanford(start):
now_cost=[float("inf") for i in range(n+1)]
#각 도시의 최소비용을 담을 리스트
now_cost[start]=0
#시작도시는 현재 위치이기때문에 비용이 없음
for _ in range(n-1):
#시작도시를 제외한 모든 도시의 개수만큼 탐색 이것을 넘으면 모든 도시의 개수를 넘어서 돌릴게 있다는 이야기 이므로 순환되고있다는 걸 알 수 있다.
for start_city,end_city,cost in bus_num:
#모든 간선을 비교한다.
if now_cost[start_city]!=float("inf") and now_cost[start_city]+cost < now_cost[end_city]:
now_cost[end_city] = cost+now_cost[start_city]
#만약 시작도시를 인덱스로 갖는 값이 초기값이거나 최소비용이 이 간선을 사용한것보다 작으면 돌지 않고 둘다 해당되#면 갱신한다.
for start_city,end_city,cost in bus_num:
if now_cost[start_city]!=float("inf") and now_cost[start_city] + cost < now_cost[end_city]:
return 0
#순환 되는지 확인
return now_cost
#갱신된 리스트 리턴
n,m=map(int,input().split())
bus_num=[list(map(int,input().split())) for i in range(m)]
start=1
now_cost=bellmanford(start)
if now_cost!=0:
# 순환되지 않을때
for i in range(2,n+1):
print(now_cost[i] if now_cost[i]!=float("inf") else -1)
#시작도시인 1을 제외하고 인덱스 편할려고 더했던 0도 제외하고 나머지 출력 만약 리스트가 아직 초기값이면 -1 출력
else:
print(-1)
#순환되면 -1 출력
#1916 최소비용 구하기 풀다가 11657 벨만포드까지 왔다. 음수가 더해지면서 다익스트라를 못 사용한다고 할때 사용할 #알고리즘이다.
'백준풀이-python' 카테고리의 다른 글
1005 ACM Craft (0) | 2021.08.09 |
---|---|
2252 줄 세우기(insert 와 append의 시간효율성) (0) | 2021.08.09 |
16916 부분 문자열 (0) | 2021.08.04 |
1197 최소 스패닝 트리 (0) | 2021.07.29 |
1916 최소비용 구하기(벨만포드 실패) (0) | 2021.07.28 |