https://www.acmicpc.net/problem/14938
14938번: 서강그라운드
예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을
www.acmicpc.net
문제 한줄 이해
- 주어진 노드들 사이의 최소 거리를 구하고 제시된 거리보다 낮은 곳을 방문해 최대한 많은 양의 아이템을 구하는 경우를 출력하기
생각난 풀이
1번째 방법: 문제를 읽고 생각난 필요한 조건들
1. 각 노드들 사이의 최소거리 구하기
why? 문제에서 예은이는 정해진 범위 m만큼만 이동 할 수 있다고 한다.
2. 각 노들드의 아이템 수를 담을 리스트를 따로 만들어 놓기
3. 어떤 노드에 예은이가 떨어질지 정해진게 없으므로 모든 노드들의 경우를 구하기
따라서 이 조건들을 적용시키기 위해 다익스트라 알고리즘을 생각했다
import sys
import heapq
n, m, r = map(int,sys.stdin.readline().split())
n_item = list(map(int,sys.stdin.readline().split()))
graph = [[]for i in range(n+1)]
#양방향이기 때문에 a->b b->a 다 가능 하므로 그래프에 저장할때 같이 하기
for i in range(r):
a, b, i = map(int,sys.stdin.readline().split())
graph[a].append((b,i))
graph[b].append((a,i))
def dik(start):
hq = []
heapq.heappush(hq,(0,start))
dis[start] = 0
while hq:
nowdis, nown = heapq.heappop(hq)
if nowdis > dis[nown]:
continue
for i in graph[nown]:
newdis = i[1] + nowdis
if newdis < dis[i[0]]:
dis[i[0]] = newdis
heapq.heappush(hq,(newdis,i[0]))
ans = 0
#예은이가 각 노드에 떨어졌을때 얻을 수 있는 아이템수 구하기
for i in range(1,n+1):
dis = [1e9] * (n+1)
dik(i)
result = 0
for j in range(1,n+1):
if dis[j] <= m:
result += n_item[j-1]
if result > ans:
ans = result
print(ans)
'알고리즘 > Python' 카테고리의 다른 글
[백준] 1238 - 파티 (0) | 2023.08.28 |
---|---|
[백준] 17144 - 미세먼지 안녕! (0) | 2023.08.25 |
[백준] 12851 - 숨바꼭질2 (0) | 2023.08.21 |
[백준] 11054 - 가장 긴 바이토닉 부분 수열 (0) | 2023.08.20 |
[백준] 9935 - 문자열 폭발 (0) | 2023.08.17 |