본문 바로가기

알고리즘/백준

[백준] 1865번 : 웜홀

728x90

1865번: 웜홀

 

1865번: 웜홀

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

www.acmicpc.net

🤔 문제분석

밸만포드로 문제를 해결할 수 있습니다. 어떠한 노드에서 출발해도 상관이 없기때문에 1번 노드에서 출발 하여 문제를 해결하였습니다.

💻 코드

import sys
input = sys.stdin.readline

TC = int(input())

def bellman_ford(start):
    distance = [INF for _ in range(N+1)]
    distance[start] = 0
    for n in range(N):
        for e in range(M*2 + W):
            start, end, cost = edge[e][0], edge[e][1], edge[e][2]
            new_cost = distance[start] + cost
            if distance[end] > new_cost:
                distance[end] = new_cost
                
                if n == N-1:
                    return True
                
    return False
    
for _ in range(TC):
    N, M, W = map(int, input().split())
    
    edge = []
    INF = sys.maxsize
    
    for _ in range(M):
        S, E, T = map(int, input().split())
        edge.append((S, E, T))
        edge.append((E, S, T))
        
    for _ in range(W):
        S, E, T = map(int, input().split())
        edge.append((S, E, -T))
        
    if bellman_ford(1):
        print("YES")
    else:
        print("NO")

🎯 피드백 및 개선사항

기존 벨만포트와 다른것은 distance[start] ≠ INF 일때만 방문했었는데, 그렇지 않아도 됩니다. 왜냐하면 연결되어있지 않는 간선이 존재할 수 있을 뿐더러, 우리가 구하고자하는것은 음의간선으로 무한 사이클이 있는지 판별하는거에 관심이 있기 때문입니다.

728x90

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

[백준] 6593번 : 상범 빌딩  (0) 2024.03.18
[백준] 2458번 : 키 순서  (1) 2024.03.16
[백준] 1613번 : 역사  (0) 2024.03.10
[백준] 4179번 : 불!  (0) 2024.03.10
[백준] 11779번 : 최소비용 구하기2  (0) 2024.03.05