import heapq def dijkstra(adj, start): dist = {node: float('inf') for node in adj} dist[start] = 0 heap = [(0, start)] while heap: d, node = heapq.heappop(heap) if d > dist[node]: continue for neighbor, edge_weight in adj[node]: new_dist = d + edge_weight if new_dist < dist[neighbor]: dist[neighbor] = new_dist heapq.heappush(heap, (new_dist, neighbor)) return dist def solve_case(west_stations, east_stations, overpass_options): # Build the initial graph graph = {i: [] for i in range(1, west_stations + east_stations + 1)} for i in range(1, west_stations): graph[i].append((i+1, 1)) graph[i+1].append((i, 1)) for i in range(1, east_stations): graph[west_stations+i].append((west_stations+i+1, 1)) graph[west_stations+i+1].append((west_stations+i, 1)) overpass_weights = {} for i, (west, east) in enumerate(overpass_options): weight = dijkstra(graph, west)[east] overpass_weights[i] = weight graph[west].append((west_stations+east, weight)) graph[west_stations+east].append((west, weight)) # Solve each overpass option ans = [] for i, (west, east) in enumerate(overpass_options): graph[west].remove((west_stations+east, overpass_weights[i])) graph[west_stations+east].remove((west, overpass_weights[i])) dist = dijkstra(graph, 1) total_dist = sum(sum(dist.values()) - v for v in dist.values()) avg_dist = total_dist / (west_stations * east_stations) ans.append(avg_dist) graph[west].append((west_stations+east, overpass_weights[i])) graph[west_stations+east].append((west, overpass_weights[i])) return ans # Parse input and solve each test case t = int(input()) for i in range(1, t+1): w, e, c = map(int, input().split()) overpass_options = [tuple(map