前提
競技プログラミング(AtCoder)にて、なぜTLEが発生するのか分からないため質問させていただきます。
AtCoder Beginner Contest 299E問題(リンク)を解いていました。
提出コードがTLEするためコードテストをしていると、どうやら以下の配列distanceを作成する過程で時間がかかっているようでした。
配列distanceは、全ての頂点を始点として幅優先探索を行うことでdistance[i][j] = 地点iからの最短距離がjとなる地点の集合となる配列です。
distance[i][j]の中身をlistにし、追加前に存在確認をすることで重複を無くすようにするとパフォーマンスが改善することからsetの影響で時間が掛かっているのかなとは思うのですが、具体的な原因がはっきりしません。
もしよろしければ、どのような原因で時間が掛かっているのかご教示いただければ幸いです。
該当のソースコード
Python
1import collections 2 3# 入力 4N,M = map(int,input().split()) 5 6# グラフ生成 7graph = {i:[] for i in range(1,(N+1))} 8for _ in range(M): 9 u,v, = map(int,input().split()) 10 graph[u].append(v) 11 graph[v].append(u) 12 13# distance[i][j] = 地点iからの最短距離がjとなる地点のset 14distance = [ collections.defaultdict() for _ in range(N+1) ] 15 16# 全ての頂点を始点としてBFS 17for i in range(1,N+1): 18 queue = collections.deque() 19 ans = [-1]*(N+1) 20 distance[i][0] = {i} 21 queue.append(i) 22 ans[i] = 0 23 while queue: 24 q = queue.popleft() 25 26 if not graph[q]: 27 continue 28 for x in graph[q]: 29 if ans[x] == -1: 30 queue.append(x) 31 ans[x] = ans[q]+1 32 if ans[x] in distance[i]: 33 distance[i][ans[x]].add(x) 34 else: 35 distance[i][ans[x]] = {x}
試したこと
テストケース(リンク)をコードテストした結果が以下になります。
PyPy3:実行時間 2065 ms, メモリ 893200 KB
Python: 実行時間 8713 ms, メモリ 870412 KB
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/07/09 02:32 編集