18352特定の距離内で都市を検索/出力時間
複数のExtraTableを埋め込むプロセス(ゆっくり見てください)
質問:
例I/O:
考慮すべきこと:
2行のコードを追加する時間差...
if cost[now] < tmp_cost:
continue
if cost[now] == k:
continue
import sys
import heapq
# 다익스트라 알고리즘.
# 최단 거리가 k 인 도시를 오름차순으로 출력.
# 준비 : 보드 2개를 만든다.
# (1) graph :
# - 길이 뚤린 곳을 표시해줄 보드, n + 1 행으로 만들어놔서 1 indexing
# - 문제 입력값이 아래 처럼 주어지면, graph = [ [], [2,3], [3,4], [], [] ] <= 1번길과 연결된곳 : 2,3 / 2번길 : 3,4
# 1 2
# 1 3
# 2 3
# 2 4
# (2) cost :
# - 처음에 inf 로 초기화 되어있는 보드, 기능은 목적지에 도착했을때 최단거리의 비용을 입력해줄 보드이다.
# - A-B-E-C : cost = 4로 되어있을 때, A-D-C 길이 있으면 cost = 3 으로 바꿔준다. cost 배열은 1차원이면될듯? 시작도시만 확인하면되니까.
# 시작점부터 배열을 돌며 길이 있는 곳으로 이동한다.
def get_cost(start):
heap = []
heapq.heappush(heap, (start, 0))
cost[start] = 0
while heap:
now, tmp_cost = heapq.heappop(heap)
if cost[now] < tmp_cost:
continue
if cost[now] == k:
continue
tmp_cost += 1
for city in graph[now]:
if cost[city] > tmp_cost: # 지금 한칸 이동하는 것이므로 + 1 보다 작은지 확인.
cost[city] = tmp_cost
heapq.heappush(heap, (city, tmp_cost))
# print(cost)
inf = 300000 # 하나씩 다 거쳐서 간다고 했을 때, 30만개의 도시가 최대니까 일케하면 될듯?
n, m, k, x = map(int, sys.stdin.readline().split())
count = 0
cost = [inf] * (n + 1)
graph = list([] for _ in range(n + 1))
for _ in range(m):
i, j = map(int, sys.stdin.readline().split())
graph[i].append(j)
get_cost(x)
if k not in cost:
print(-1)
else:
for i in range(1, n + 1):
if cost[i] == k:
print(i)
その他のクイックコード
プールは似ていますが、k距離のノードに達すると、答え配列に予め組み込まれるプロセスによって時間が短縮されます。
import heapq
import sys
read = sys.stdin.readline
def solve():
N, M, K, X = map(int, read().split())
# 인접 리스트
adj = [list() for _ in range(N + 1)]
for _ in range(M):
f, t = map(int, read().split())
adj[f].append(t)
# 최단 거리 배열
min_dists = [300002] * (N + 1)
# 우선순위 큐
# (해당 노드까지의 최단거리, 노드번호) 튜플을 원소로 가짐
q = []
heapq.heappush(q, (0, X))
min_dists[X] = 0
ans = []
# 남은 모든 노드들에 대하여
while q:
# 우선순위 큐 안에 있는 최단 거리 노드 선택
dist, node = heapq.heappop(q)
# 이미 처리된 노드라면 continue
if min_dists[node] < dist:
continue
# 현재 노드까지의 거리가 K라면 정답 리스트에 저장 후 continue
if min_dists[node] == K:
ans.append(str(node))
continue
# 연결된 노드들의 최단거리 갱신 후 우선순위 큐에 추가
for to in adj[node]:
if min_dists[to] > dist + 1:
min_dists[to] = dist + 1
heapq.heappush(q, (dist + 1, to))
return '\n'.join(ans) if ans else -1
print(solve())
Reference
この問題について(18352特定の距離内で都市を検索/出力時間), 我々は、より多くの情報をここで見つけました https://velog.io/@stthunderl/18352-특정거리의-도시찾기-파이썬-출력시간テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol