import heapq def dijkstra(graph, start): dist = {node: float('inf') for node in graph} dist[start] = 0 heap = [(0, start)] while heap: (d, node) = heapq.heappop(heap) if d > dist[node]: continue for neighbor, weight in graph[node].items(): if dist[node] + weight < dist[neighbor]: dist[neighbor] = dist[node] + weight heapq.heappush(heap, (dist[neighbor], neighbor)) return dist def calculate_average_distance(western_connections, eastern_connections, options): # Build graph of existing connections graph = {i: {} for i in range(1, len(western_connections) + len(eastern_connections) + 1)} for i, c in enumerate(western_connections): graph[i+1][c] = 1 graph[c][i+1] = 1 for i, c in enumerate(eastern_connections): graph[i+len(western_connections)+1][c+len(western_connections)] = 1 graph[c+len(western_connections)][i+len(western_connections)+1] = 1 # Calculate distances for each option distances = [] for w, e in options: # Add overpass connection to graph graph[w][e+len(western_connections)] = 1 graph[e+len(western_connections)][w] = 1 # Calculate distances using Dijkstra's algorithm total_distance = 0 count = 0 for i in range(1, len(western_connections) + len(eastern_connections) + 1): for j in range(i+1, len(western_connections) + len(eastern_connections) + 1): dist = dijkstra(graph, i) if dist[j] != float('inf'): total_distance += dist[j] - 1 count += 1 distances.append(total_distance / count) # Remove overpass connection from graph del graph[w][e+len(western_connections)] del graph[e+len(western_connections)][w] return distances # Read input t = int(input()) for i in range(1, t+1): w, e, c = map(int, input().split()) western_connections = list(map(int, input().split())) eastern_connections = list(map(int, input().split())) options = [tuple(map(int, input().split())) for _ in range(c)] # Calculate average distances for each option distances = calculate_average_distance(western_connections, eastern_connections, options) # Output result print(f"Case #{i}: {' '.join(f'{d:.1f}' for d in distances);