結果
問題 | No.95 Alice and Graph |
ユーザー |
|
提出日時 | 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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 14 |
ソースコード
import sysimport mathimport bisectfrom heapq import heapify, heappop, heappushfrom collections import deque, defaultdict, Counterfrom functools import lru_cachefrom itertools import accumulate, combinations, permutations, productsys.setrecursionlimit(1000000)MOD = 10 ** 9 + 7MOD99 = 998244353input = 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 = 100dp = [[INF] * (1<<N) for _ in range(N)]dp[start][1<<start] = 0for case in range(1<<N):for u in range(N):if dp[u][case] >= INF:continuefor v in range(N):if (case >> v) & 1:continuedp[v][case|(1<<v)] = min(dp[v][case|(1<<v)], dp[u][case] + D[u][v])res = INFfor i in range(N):res = min(res, dp[i][-1])return resdef 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] = 0for u, v in UV:D[u][v] = 1D[v][u] = 1for 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:continuefixed.append(x)if len(fixed) > K+1:breakn = 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()