← Back to Forum
CCC 2025 S4 - Floor is Lava Solution
# Advay Chandorkar, Glenforest SS (advayc)
# py3 solution for 25' s4
import heapq
# read number of levels (N) and number of tunnels (M)
N, M = map(int, input().split())
# initialize a list of sets to store unique boot levels for each level
levels = [set() for _ in range(N)]
tunnels = []
# read tunnel information and populate levels and tunnels
for _ in range(M):
a, b, c = map(int, input().split())
a -= 1 # convert to 0-indexed
b -= 1
tunnels.append((a, b, c))
levels[a].add(c)
levels[b].add(c)
# ensure level 0 has boot level 0
levels[0].add(0)
# sort boot levels for each level
for i in range(N):
levels[i] = sorted(levels[i])
# calculate offset for node indexing in the graph
offset = [0] * (N + 1)
total_nodes = 0
for i in range(N):
offset[i] = total_nodes
total_nodes += len(levels[i])
offset[N] = total_nodes
# map each boot level to its index for quick access
maps = []
for i in range(N):
d = {}
for j, val in enumerate(levels[i]):
d[val] = j
maps.append(d)
# initialize the graph with empty adjacency lists
graph = [[] for _ in range(total_nodes)]
# add intra-room edges between adjacent boot levels with cost equal to their difference
for i in range(N):
base = offset[i]
L = levels[i]
for j in range(len(L) - 1):
u = base + j
v = base + j + 1
diff = L[j+1] - L[j]
graph[u].append((v, diff))
graph[v].append((u, diff))
# add tunnel edges with zero cost if the required boot level is available
for a, b, c in tunnels:
u = offset[a] + maps[a][c]
v = offset[b] + maps[b][c]
graph[u].append((v, 0))
graph[v].append((u, 0))
INF = 10**18
# initialize distances with infinity
dist = [INF] * total_nodes
# start from level 0 with boot level 0
start_node = offset[0] + maps[0][0]
dist[start_node] = 0
# use a min-heap for dijkstra's algorithm
heap = []
heapq.heappush(heap, (0, start_node))
# perform dijkstra's algorithm to find minimum distances
while heap:
d, u = heapq.heappop(heap)
if d != dist[u]:
continue
for v, cost in graph[u]:
nd = d + cost
if nd < dist[v]:
dist[v] = nd
heapq.heappush(heap, (nd, v))
# find the minimum distance to the last level
ans = INF
base = offset[N-1]
for j in range(len(levels[N-1])):
node = base + j
if dist[node] < ans:
ans = dist[node]
print(ans)
By advayc on 3/12/2025
1
Comments
Thank you, will add
By tankman613 on 3/15/2025