restructure zeta/** to storage/zeta/**
This commit is contained in:
63
storage/zeta/py/completed/2098.py
Normal file
63
storage/zeta/py/completed/2098.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import sys
|
||||
import heapq as hq
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
INF: int = 1 << 32
|
||||
FULL: int
|
||||
|
||||
|
||||
def vis_full(vis) -> int:
|
||||
return vis == FULL
|
||||
|
||||
|
||||
def vis_add(vis, i) -> int:
|
||||
return vis | (1 << i)
|
||||
|
||||
|
||||
def vis_is_in(vis, i) -> bool:
|
||||
return vis & (1 << i) != 0
|
||||
|
||||
|
||||
def get_min_cost(N: int, W: list[list[int]]):
|
||||
start = 0
|
||||
st_vis = 0
|
||||
st_vis = vis_add(st_vis, 0)
|
||||
|
||||
M = [[-1 for _ in range(FULL + 1)] for _ in range(N)]
|
||||
stack = [(0, st_vis)]
|
||||
|
||||
while stack:
|
||||
now, vis = stack[-1]
|
||||
if vis_full(vis):
|
||||
stack.pop()
|
||||
if W[now][start] != 0:
|
||||
M[now][vis] = W[now][start]
|
||||
else:
|
||||
M[now][vis] = INF
|
||||
continue
|
||||
|
||||
if M[now][vis] == -1:
|
||||
M[now][vis] += 1
|
||||
for i in range(N):
|
||||
if (not vis_is_in(vis, i)) and W[now][i] != 0:
|
||||
if M[i][vis_add(vis, i)] <= 0:
|
||||
stack.append((i, vis_add(vis, i)))
|
||||
|
||||
elif M[now][vis] == 0:
|
||||
stack.pop()
|
||||
s = []
|
||||
for i in range(N):
|
||||
if not vis_is_in(vis, i) and W[now][i] != 0:
|
||||
s.append(M[i][vis_add(vis, i)] + W[now][i])
|
||||
M[now][vis] = min(s) if s else INF
|
||||
else:
|
||||
continue
|
||||
return M[0][st_vis]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
N = int(input())
|
||||
W = [list(map(int, input().split())) for _ in range(N)]
|
||||
FULL = (1 << N) - 1
|
||||
print(get_min_cost(N, W))
|
||||
Reference in New Issue
Block a user