from collections import defaultdict from heapq import heappush, heappop from typing import List, Tuple def dijkstra(graph: List[List[Tuple[int,int]]], start: int) -> List[int]: n = len(graph) dist = [float('inf')]*n dist[start] = 0 visited = [False]*n heap = [(0, start)] while heap: d, node = heappop(heap) if visited[node]: continue visited[node] = True for neighbor, weight in graph[node]: if not visited[neighbor]: new_dist = d + weight if new_dist < dist[neighbor]: dist[neighbor] = new_dist heappush(heap, (new_dist, neighbor)) return dist def average_distance(w: int, e: int, c: int, wx: List[int], ey: List[int], options: List[Tuple[int,int]]) -> List[float]: west_graph = defaultdict(list) for i in range(w-1): west_graph[i].append((i+1, 1)) west_graph[i+1].append((i, 1)) east_graph = defaultdict(list) for i in range(e-1): east_graph[i].append((i+1, 1)) east_graph[i+1].append((i, 1)) for option in options: west, east = option west_graph[w-1].append((west-1, 1)) west_graph[west-1].append((w-1, 1)) east_graph[e-1].append((east-1, 1)) east_graph[east-1].append((e-1, 1)) west_dist = dijkstra([west_graph[i] for i in range(w)], w-1) east_dist = dijkstra([east_graph[i] for i in range(e)], e-1) distances = [west_dist[i]+east_dist[j]+1 for i in range(w) for j in range(e)] yield sum(distances)/(w*e-1) west_graph[w-1].remove((west-1, 1)) west_graph[west-1].remove((w-1, 1)) east_graph[e-1].remove((east-1, 1)) east_graph[east-1].remove((e-1, 1)) # example usage t = int(input()) for i in range(1, t+1): w, e, c = map(int, input().split()) wx = list(map(int, input().split())) ey = list(map(int, input().split())) options = [tuple(map(int, input().split())) for _ in range(c)] result = list(average_distance(w, e, c, wx, ey, options)) print(f"Case #{i}: {' '.join([f'{r:.6f}' for r in result])}")