티스토리 뷰

알고리즘/백준

[BAEKJOON]1865 웜홀 - Python

응애~ 개발자 2023. 1. 3. 17:42
728x90
반응형

문제 요약

  • 알고리즘 분류: 트리
  • 난이도: Gold3
  • 문제내용:
    • 도로는 방향이 없고 웜홀은 방향이 있다.
    • 웜홀로 이동하면 시간은 거꾸로 흘러 간다.
    • 자기 자신으로 돌아 올때 거꾸로 흘러 가는지 출력해라.
  • 사이트: https://www.acmicpc.net/problem/1865
 

1865번: 웜홀

첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),

www.acmicpc.net

문제풀이

   이번에는 문제 유형은 벨만-포드 알고리즘이다. 벨만-포드 알고리즘에 대한 자세한 설명은 여기에서 보면된다.

 기본적으로 벨만-포드 알고리즘 지식과 구현 하면되기 때문에 자세한 설명은 생략한다. 다만 주위해야할점은 간선이 다리는 방향이 없어서 S → E, E → S 둘다 포함 시켜야 하고 거리를 선언할때 시작점을 초기화 없이 진행 하면된다.

 

Code

Python

 여기서 INF 설정할때 무한(float('inf'))으로 하면  거리를 비교 할수가 없다.

import sys
input = sys.stdin.readline
INF = 1e9

def Bellman_Ford():
    distances = [INF] * (N + 1)
    
    # 라운드 마다 진행
    for i in range(N):
        # 각 간선
        for j in range(len(edges)):
            current_node, next_node, cost = edges[j]
            
            if distances[next_node] > distances[current_node] + cost:
                distances[next_node] = distances[current_node] + cost
                # n번째 라운드에서도 값이 갱신된다면 음수 순환이 존재
                if i == N - 1: return True
    
    return False
                
        
for _ in range(int(input())):
    N, M, W = map(int, input().split())
    edges = []
    for _ in range(M):
        S, E, T = map(int, input().split())
        edges.append((S, E, T))
        edges.append((E, S, T))
    for _ in range(W):
        S, E, T = map(int, input().split())
        edges.append((S, E, -T))
    
    print('YES' if Bellman_Ford() else 'NO')
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]15663 N과 M (9)  (0) 2023.01.05
[BAEKJOON]15657 N과 M (8)  (0) 2023.01.04
[BAEKJOON]2263 트리의 순회- Python  (0) 2023.01.02
[BAEKJOON]1918 후위 표기식 - Python  (0) 2022.12.29
[BAEKJOON]1167 트리의 지름 - Python  (0) 2022.12.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함