(전공복습) 데이터과학 4. 시각화
차례
처음에는 DFS로 접근을 하려고 했으나, 논리에 허점을 찾지 못하고 맞왜틀을 반복했다.
어쩔 수 없이 DFS는 포기하고, 플로이드-워셜 알고리즘으로 각 노드에서 노드로의 최단거리를 구한 후 최단거리 배열을 순회하며 노드 간 거리가 m
이하일 경우 값을 더해서 해결했다.
아직도 DFS가 왜 틀렸는지는 잘 모르겠다. 질문 게시판을 보니 더 짧은 거리로 이미 방문한 노드를 재방문하는 경우를 예외처리해야 한다는 부분이 있어서 해결했는데도 여전히 틀렸다고 나온다.
나중에 한번 코드를 자세히 살펴봐야겠다.
from sys import stdin
INF = float('inf')
n, m, r = map(int, input().split())
items = list(map(int, input().split()))
graph = [[INF] * (n+1) for _ in range(n+1)]
# 자기 자신와의 거리 0으로 초기화
for i in range(n+1):
graph[i][i] = 0
# 인접 노드와의 거리 초기화
for _ in range(r):
a, b, l = map(int, input().split())
graph[b][a] = graph[a][b] = min(graph[a][b], l)
# 플로이드-워셜 알고리즘
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
# 거리가 m 이하일 경우 아이템을 획득하고 아니면 획득하지 못하는 배열
arr = [[(items[i-1] if graph[i][j] <= m else 0) for i in range(1, n+1)] for j in range(1, n+1)]
# 배열 각 행의 합을 구한 후 그 중 최대치를 출력한다
print(max(map(sum, arr)))
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...