from collections import defaultdict def bfs(graph, start): visited = set() distances = {start: 0} queue = [start] while queue: node = queue.pop(0) if node in visited: continue visited.add(node) for neighbor in graph[node]: if neighbor not in visited: distances[neighbor] = distances[node] + 1 queue.append(neighbor) return distances def solve_case(W, E, C, west_conn, east_conn, overpass_options): # Create adjacency lists for the western and eastern stations west_graph = defaultdict(list) east_graph = defaultdict(list) for i in range(W-1): west_graph[i+1].append(west_conn[i]) west_graph[west_conn[i]].append(i+1) for i in range(E-1): east_graph[i+1].append(east_conn[i]) east_graph[east_conn[i]].append(i+1) # Calculate distances from each western station to all others west_distances = {} for i in range(1, W+1): distances = bfs(west_graph, i) for j in range(i+1, W+1): west_distances[(i,j)] = distances[j] # Calculate distances from each eastern station to all others east_distances = {} for i in range(1, E+1): distances = bfs(east_graph, i) for j in range(i+1, E+1): east_distances[(i,j)] = distances[j] # Calculate the average distance for each overpass option results = [] for k in range(C): w, e = overpass_options[k] total_distance = 0 for i in range(1, W+1): for j in range(1, E+1): if (i,j) != (w,e) and (i,j) != (e,w): distance = min(west_distances[(i,w)] + 1 + east_distances[(j,e)], west_distances[(i,e)] + 1 + east_distances[(j,w)]) total_distance += distance avg_distance = total_distance / (W*E - 1) results.append(avg_distance) return results # Read input and solve each test case T = int(input()) for case in range(1, T+1): W, E, C = map(int, input().split()) west_conn = list(map(int, input().split())) east_conn = list(map(int, input().split())) overpass_options = [tuple(map(int, input().split())) for _ in range(C)] result = solve_case(W, E, C, west_conn, east_conn, overpass_options) print(f"Case #{case}: {' '.join(map(str, result))}")