from collections import defaultdict def bfs(graph, start): queue = [(start, 0)] visited = {start} distances = defaultdict(int) while queue: node, dist = queue.pop(0) distances[node] = dist for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append((neighbor, dist+1)) return distances def solve_case(case_num, W, E, C, western, eastern, overpasses): # Create graph for the western stations west_graph = defaultdict(list) for i in range(W-1): west_graph[i+1].append(western[i]) west_graph[western[i]].append(i+1) west_distances = [bfs(west_graph, i+1) for i in range(W)] # Create graph for the eastern stations east_graph = defaultdict(list) for i in range(E-1): east_graph[i+1].append(eastern[i]) east_graph[eastern[i]].append(i+1) east_distances = [bfs(east_graph, i+1) for i in range(E)] # Calculate the average distance for each option results = [] for a, b in overpasses: dist = 0 for i in range(W): for j in range(E): if i+1 != a or j+1 != b: dist += min(west_distances[i][k]+east_distances[j][k]+2 for k in range(W+E-1)) results.append(dist/(W*E)) # Print the results print("Case #{}: {}".format(case_num, " ".join("{:.6f}".format(x) for x in results))) # Read input and solve each case T = int(input()) for case_num in range(1, T+1): W, E, C = map(int, input().split()) western = list(map(int, input().split())) eastern = list(map(int, input().split())) overpasses = [tuple(map(int, input().split())) for i in range(C)] solve_case(case_num, W, E, C, western, eastern, overpasses)