diff --git a/tgyuuAn/README.md b/tgyuuAn/README.md index 82cc1bea..eea140d7 100644 --- a/tgyuuAn/README.md +++ b/tgyuuAn/README.md @@ -49,4 +49,5 @@ | 45차시 | 2023.03.16 | 트라이 | 트라이 | https://github.com/AlgoLeadMe/AlgoLeadMe-1/pull/162 | 46차시 | 2023.03.20 | 트라이 | AB | https://github.com/AlgoLeadMe/AlgoLeadMe-1/pull/165 | 47차시 | 2023.03.22 | 수학, 분할정복 | 너 봄에는 캡사이신이 맛있단다 | https://github.com/AlgoLeadMe/AlgoLeadMe-1/pull/167 +| 48차시 | 2023.03.25 | 벨만 포드 | 골목길 | https://github.com/AlgoLeadMe/AlgoLeadMe-1/pull/171 --- diff --git "a/tgyuuAn/\353\262\250\353\247\214 \355\217\254\353\223\234/\352\263\250\353\252\251\352\270\270.py" "b/tgyuuAn/\353\262\250\353\247\214 \355\217\254\353\223\234/\352\263\250\353\252\251\352\270\270.py" new file mode 100644 index 00000000..b879b593 --- /dev/null +++ "b/tgyuuAn/\353\262\250\353\247\214 \355\217\254\353\223\234/\352\263\250\353\252\251\352\270\270.py" @@ -0,0 +1,78 @@ +import sys +from collections import deque + +def input(): return sys.stdin.readline().rstrip() + +N, M = map(int, input().split()) +edge = [[] for _ in range(N+1)] + +# 간선 정보 받음 +for _ in range(M): + start, destination, cost = map(int,input().split()) + edge[start].append([destination, cost]) + +# 초기 세팅 +board = [-int(1e9) for _ in range(N+1)] +board[1] = 0 + +# 최적의 경로를 찾기 위해 역추적 하기 위해서 이전 노드를 기록 +prev_node = [-1 for _ in range(N+1)] +prev_node[1] = 0 + +for _ in range(N-1): + for start in range(1,N+1): + for destination, cost in edge[start]: + if board[destination] < board[start] + cost: + board[destination] = board[start] + cost + prev_node[destination] = start + +has_cycle = False +is_connect_target = False +for start in range(1,N+1): + for destination, cost in edge[start]: + # 사이클 발생 + if board[destination] < board[start] + cost: + has_cycle = True + + # 사이클이 발생해도 경로랑 관련이 없을 수도 있으므로, + # 사이클이 발생한 지점이 목표 지점과 관련이 있는지 체크크 + deq = deque([start]) + visited = {start,} + while deq: + now = deq.popleft() + + for d, c in edge[now]: + if d in visited: continue + + deq.append(d) + visited.add(d) + + # 사이클이 있고 목표지점 혹은 시작지점과 붙어있으면 -1 + if d == 1 or d == N: + is_connect_target = True + break + + if is_connect_target: break + break + +# 사이클이 있는데 해당 사이클이 목표와 연결되어 있을 경우 +if has_cycle and is_connect_target: print(-1) +else: + answer = [] + now = N + while now != 1: + answer.append(now) + now = prev_node[now] + + answer.append(now) + + if now != 1: print(-1) + else: print(*answer[::-1]) + +# 총 간선 = 2만개, +# 총 노드 = 100개 +# 벨만 포드 = ( 간선 X 노드 -1 ) -> 198만 시간 복잡도 가능. + +# 최적의 경로 +# 사이클이 발생해도 갈 수 있을 수 있음. +# 사이클이 없더라도 도달할 수 없을 수 있음. \ No newline at end of file