前提・実現したいこと
問題:https://atcoder.jp/contests/typical-algorithm/tasks/typical_algorithm_c
やり方として、訪れた都市の状態管理をビットで表しています。
例:都市が8個の時、都市1と3のみ訪れたとすると
n = 00000101
発生している問題・エラーメッセージ
下記コードの26行目を消去したら答えがもとまったのですが、なぜ答えが出るようになったか理解できません。
私の考えでは、訪れた都市の状態(n)にそもそも”都市iを訪れた”情報がないと次の都市jに移動できないのではないかと考えています。
該当のソースコード
Python3
1N = int(input()) 2 3A = [] #A[a][b]は都市aからbへいく時のコスト 4 5for i in range(N): 6 a = list(map(int, input().split())) 7 A.append(a) 8 9ALL = 1<<N 10INF = 10**100 11 12cost = [] 13for n in range(ALL): #訪れたとしが集合nで表され、最後に訪れたとしがiの時の総コスト 14 cost.append([INF]*N) 15cost[0][0] = 0 16 17#重複してはいけないので、すでに訪れていないかのチェック。訪問済ならtrue 18def _hasbit(n, i): 19 return (n & (1 << i) > 0) 20 21for n in range(ALL): 22 for i in range(N):#移動元 23 if _hasbit(n,i):#←消した箇所:訪れた集合のなかにしっかりとi番目の都市が含まれているか(i番目の都市が訪問済でなければ、そもそも移動できないのでは?) 24 for j in range(N):#移動先 25 if _hasbit(n,j) or i == j:#訪問済or移動元==移動先の時スキップ 26 continue 27 cost[n| (1<< j)][j] = min(cost[n| (1 << j)][j], cost[n][i] + A[i][j]) 28 29print(cost[ALL-1][0])
試したこと
あらゆる箇所でデバッグプリントしましたが理解できませんでした…
補足情報(FW/ツールのバージョンなど)
Python3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。