SWEA 1795 인수의 생일 파티
SWEA 1795 인수의 생일 파티
문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4xuqCqBeUDFAUx
풀이
- 다익스트라 알고리즘을 활용
- 왕복을 계산하는 것임으로 시작 노드와 정상 노드를 정상적으로 받아서 1번
- 시작 노드와 정상 노드를 반대로 받아서 1번
- 위와 같이 수행 후 더했을 때 최대가 되는 값을 출력
코드
import sys
import heapq
sys.stdin = open('input.txt')
T = int(input())
def dij(X,graph): # 다익스트라 알고리즘
Q = [(0, X)]
dist = [-1] * (N + 1)
while Q: # Q가 빌 때까지 반복 수행
time, node = heapq.heappop(Q) # 우선 순위 Q를 통해 가중치를 기준으로 작은 값부터 뽑아냄
if dist[node] == -1: # 아직 도착하지 않은 정점이면
dist[node] = time # 해당 정점까지 도달하는 비용을 넣어주고
for v, w in graph[node]: # 해당 정점에서 다른 인접 정점을 추출
alt = time + w # 기존에 time에 인접 정점까지 가는 비용을 더해서 우선 순위 Q에 넣어줌
heapq.heappush(Q, (alt, v))
return dist
for tc in range(1):
N, M, X = map(int, input().split())
graph1 = [[] for _ in range(N + 1)]
graph2 = [[] for _ in range(N + 1)]
for _ in range(M):
u, v, w = map(int, input().split())
graph1[u].append((v, w)) # 시작과 도착 노드를 정상적으로 입력
graph2[v].append((u, w)) # 시작과 도착 노드를 반대로 입력
dist1 = dij(X,graph1) # X에서 다른 정점으로 가는 거
dist2 = dij(X, graph2) # 다른 정점에서 X로 오는 거
result = 0
print(dist2)
for i in range(1,N+1):
result = max(result, dist1[i]+dist2[i]) # 오는 것과 가는 것의 합이 최대가 되는 것을 뽑아낸다
print(f'#{tc+1} {result}')
결과
다익스트르 알고리즘 구현과 왕복을 계산할 때 굳이 모든 노드에서 다익스트라 알고리즘을 적용해야되는 게 아니다라는 것을 아는지 물어보는 문제이다.
해당 부분은 이미 알고 있었지만 우선 순위 Q 부분을 라이브러리를 사용하지 않고 직접 가중치 기준으로 정렬해가며 문제를 풀려고하니 시간 초과에 걸렸다....
heapq 를 사용하니 시간이 매우 빨랐다... 고맙다 이것아.. 앞으로는 자주 애용해야겠다.(코테에서도 쓸 수 있나여??)
Author And Source
이 문제에 관하여(SWEA 1795 인수의 생일 파티), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shawnk123/SWEA-1795-인수의-생일-파티저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)