結果
問題 | No.95 Alice and Graph |
ユーザー | Mao-beta |
提出日時 | 2024-03-07 01:44:37 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,508 ms / 5,000 ms |
コード長 | 2,305 bytes |
コンパイル時間 | 285 ms |
コンパイル使用メモリ | 82,152 KB |
実行使用メモリ | 195,332 KB |
最終ジャッジ日時 | 2024-09-29 18:38:16 |
合計ジャッジ時間 | 8,862 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 963 ms
156,912 KB |
testcase_01 | AC | 193 ms
85,200 KB |
testcase_02 | AC | 193 ms
89,672 KB |
testcase_03 | AC | 49 ms
65,220 KB |
testcase_04 | AC | 1,392 ms
192,092 KB |
testcase_05 | AC | 1,151 ms
157,864 KB |
testcase_06 | AC | 1,508 ms
195,332 KB |
testcase_07 | AC | 194 ms
89,020 KB |
testcase_08 | AC | 53 ms
68,380 KB |
testcase_09 | AC | 42 ms
56,096 KB |
testcase_10 | AC | 43 ms
63,372 KB |
testcase_11 | AC | 59 ms
72,484 KB |
testcase_12 | AC | 55 ms
69,348 KB |
testcase_13 | AC | 120 ms
80,960 KB |
ソースコード
import sys import math import bisect from heapq import heapify, heappop, heappush from collections import deque, defaultdict, Counter from functools import lru_cache from itertools import accumulate, combinations, permutations, product sys.setrecursionlimit(1000000) MOD = 10 ** 9 + 7 MOD99 = 998244353 input = lambda: sys.stdin.readline().strip() NI = lambda: int(input()) NMI = lambda: map(int, input().split()) NLI = lambda: list(NMI()) SI = lambda: input() SMI = lambda: input().split() SLI = lambda: list(SMI()) EI = lambda m: [NLI() for _ in range(m)] def TSP(N, D, start): """ 巡回セールスマン問題 O(N^2*2^N) :param N: 頂点数 :param D: NxNの距離行列 :param start: 始点のindex :return: 最短距離 """ INF = 100 dp = [[INF] * (1<<N) for _ in range(N)] dp[start][1<<start] = 0 for case in range(1<<N): for u in range(N): if dp[u][case] >= INF: continue for v in range(N): if (case >> v) & 1: continue dp[v][case|(1<<v)] = min(dp[v][case|(1<<v)], dp[u][case] + D[u][v]) res = INF for i in range(N): res = min(res, dp[i][-1]) return res def main(): N, M, K = NMI() UV = EI(M) UV = [[x-1, y-1] for x, y in UV] INF = 100 # ワーシャルフロイド D = [[INF]*N for _ in range(N)] for i in range(N): D[i][i] = 0 for u, v in UV: D[u][v] = 1 D[v][u] = 1 for k in range(N): for u in range(N): for v in range(N): D[u][v] = min(D[u][v], D[u][k] + D[k][v]) A = [(1<<(k-1))-1 for k in range(1, N+1)] ans = 0 # 回ることにした頂点(0以外) fixed = [0] for x in range(N-1, 0, -1): # xはK歩で行けるなら絶対fixedに入れる if D[0][x] > K: continue fixed.append(x) if len(fixed) > K+1: break n = len(fixed) FD = [[INF]*n for _ in range(n)] for i in range(n): for j in range(n): FD[i][j] = D[fixed[i]][fixed[j]] k = TSP(n, FD, 0) if k > K: fixed.pop() else: ans += A[x] print(ans) if __name__ == "__main__": main()