巡回セールスマン問題のpythonでの解法で「x^(1<<y)」というbit演算でなぜyが含まれていない部分集合がもとまるのでしょうか?
python.py
1v, e = map(int, input().split()) 2 3inf = 10**7 4edges = [[inf]*v for _ in range(v)] 5 6for i in range(e): 7 s, t, d = map(int, input().split()) 8 edges[s][t] = d 9 10#Dpは全体集合の部分集合Sについて最後がvであるという制約の下で順序を最適化したときのSの中での最小コスト 11dp = [[inf]*v for _ in range(2**v)] 12dp[0][0] = 0 13 14#集合(訪れたか訪れていないかを表す二進数) 15for x in range(2**v): 16 #最後に訪れたノード 17 for y in range(v): 18 #最後に訪れた以外のノード 19 for z in range(v): 20 #1.すでに訪れたかどうか 2.最後に訪れたノードではないか 3. yとzはそもそもつながっているのか 21 if ((x >> y) & 1) and y != z and edges[z][y] < 10 ** 6: 22 23 dp[x][y] = min(dp[x][y], dp[x^(1<<y)][z]+edges[z][y]) 24 25if dp[-1][0] > 10**6: 26 print(-1) 27else: 28 print(dp[-1][0])
回答1件
あなたの回答
tips
プレビュー