[1219] 오민식의 고민(변형 벨만-포드)

2023. 4. 22. 19:09·Coding Test/Graph
728x90
 

1219번: 오민식의 고민

첫째 줄에 도착 도시에 도착할 때, 가지고 있는 돈의 액수의 최댓값을 출력한다. 만약 오민식이 도착 도시에 도착하는 것이 불가능할 때는 "gg"를 출력한다. 그리고, 오민식이 도착 도시에 도착

www.acmicpc.net

 

벨만-포드 알고리즘

  • 특정 출발 노드에서 다른 모든 노드까지의 최단경로 검색
  • 음수 가중치 존재
  • 음수 싸이클 존재 여부 판단
  • 2023.03.20 - [Algorithm/Graph] - [11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
  • 수행과정
    1. 모든 에지와 관련된 정보를 가져와 다음 조건에 따라 거리 리스트의 값 업데이트
      • 출발 노드가 방문한 적이 없는 노드(출발 노드 거리 == INF) 일 때 업데이트 X
      • 출발 노드의 거리 리스트 값 + 에지 가중치 < 종료노드의 거리 리스트 값일 때, 종료 노드 거리 리스트값 업데이트
    2. 노드 개수 -1번 만큼 반복
      • 노드의 개수가 N이고 음수 사이클이 없을 때 특 정 두 노드의 최단 거리를 구성할 수 있는 에지의 최대 갯수 N-1
    3. 음수 사이클 유무를 알기 위해 모든 에지에 관해 1 수행, 한 번 이라도 값이 업데이트 되면 음수 사이클 존재로 판단

 

변형된 벨만-포드 알고리즘

  • 돈을 무한히 많이 버는 케이스가 있다고 하는 것을 바탕으로 음수 사이클이 아닌 양수 사이클을 찾도록 변경
  • 양수 사이클이 있어도 출발 노드에서 이 양수 사이클을 이용해 도착 도시에 가지 못할 때 예외처리
  • 수행과정
    1. 모든 에지와 관련된 정보를 가져와 다음 조건에 따라 거리 리스트의 값 업데이트
      • 시작 도시가 방문한 적이 없는 도시일 때 (시작 도시==MIN) 업데이트 X
      • 시작 도시가 양수 사이클과 연결된 도시일때 (도착도시 == MAX) 도착 도시도 양수 사이클과 연결된 도시로 업데이트
      • 도착 도시값 < 시작 도시값 + 도착 도시 수입 - 에지 가중치일 때, 더 많이 벌 수 있는 새로운 경로로 도착 업데이트
    2. 노드보다 충분히 많은 값(N+100)으로 1 반복
      • 에지의 업데이트를 충분히 큰 수(도시 개수 N의 최대치=100)만큼 추가로 돌리면서 업데이트 수행
      • 에지를 충분히 탐색하면서 양수 사이클에서 도달할 수 있는 모든 노드를 양수 사이클에 연결된 노드로 업데이트하기 위해

풀이

"""
도시수 n(1~100), 시작, 종료, 교통수단 m(1~100)
교통 수단 정보 : 시작 끝 가격
각 도시에서 벌 수 있는 돈의 최댓값(0~1,000,000)

같은 도시 여러번 방문 가능
버는 돈보다 쓰는 돈이 많다면 도착 도시에 도착할때 지니고 있는 돈의 액수가 음수

* 도착도시에 도착할 때 지니고 있는 돈의 최대 액수
도착 불가 'gg'
무한 'Gee'
"""

import sys
input=sys.stdin.readline

# 도시수 n(1~100), 시작, 종료, 교통수단 m(1~100)
n,s,e,m=map(int, input().split())
graph = [] # 교통 수단 정보, 에지 리스트
d = [-sys.maxsize]*n # 최단 경로 리스트

# 교통 수단 정보, 에지 리스트
for _ in range(m):
    u, v, w = map(int, input().split())
    graph.append((u, v, w))

# 각 도시에서 벌 수 있는 돈의 최댓값
mList=list(map(int,input().split()))

d[s] = mList[s]
# 변형 벨만-포드
for i in range(n+101):
    for start, end, price in graph:
        if d[start]==-sys.maxsize: # 출발노드 미방문 노드
            continue
        elif d[start]==sys.maxsize: # 출발노드가 양수 사이클에 연결된 노드
            d[end]=sys.maxsize
        elif d[end] < d[start]+mList[end]-price: # 종료노드값 < 출발노드값+도착도시수입+에지가중치
            d[end]=d[start]+mList[end]-price

            # 에지 사용 횟수가 n-1을 넘어선 이후 갱신되면 양수 사이클에 연결되어 있다는 의미
            # 종료노드를 양수 사이클 연결 노드로 업데이트
            if i >= n-1:
                d[end]=sys.maxsize

if d[e] == -sys.maxsize: # 도착 불가능
    print("gg")
elif d[e]==sys.maxsize: # 양수싸이클, 무한대
    print("Gee")
else:
    print(d[e])

 

 

 

728x90
저작자표시 (새창열림)
'Coding Test/Graph' 카테고리의 다른 글
  • [1389] 케빈 베이컨의 6단계 법칙 (플로이드-워셜)
  • [17472] 다리 만들기2 (BFS, MST)
  • [1948] 임계경로(위상정렬, 에지 뒤집기)
  • [2252] 줄 세우기(위상정렬)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    트리
    BFS
    최단거리
    DP
    구간합
    힙
    최소신장트리
    정렬
    Algorithm
    백준
    그리디
    구현
    LIS
    이분탐색
    그래프
    자료구조
    재귀
    덱
    파이썬
    조합
    동적계획법
    최대공약수
    큐
    월간코드챌린지
    알고리즘
    플로이드워셜
    다익스트라
    프로그래머스
    DFS
    스택
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[1219] 오민식의 고민(변형 벨만-포드)
상단으로

티스토리툴바