from collections import defaultdict def dfs(u, p, dist, adj): for v in adj[u]: if v != p: dist[v] = dist[u] + 1 dfs(v, u, dist, adj) def compute_distances(W, E, adj_w, adj_e): dist = defaultdict(dict) for u in range(1, W+1): dfs(u, 0, dist[u], adj_w) for u in range(1, E+1): dfs(u, 0, dist[u+W], adj_e) for u in range(1, W+1): for v in range(1, E+1): d1 = dist[u][W+1] d2 = dist[v+W][1] shared = dist[u][v+W] dist[u][v] = d1 + d2 - 2*shared return dist def solve_case(case_num, W, E, C, adj_w, adj_e, overpass): dist = compute_distances(W, E, adj_w, adj_e) res = [] for i in range(C): u, v = overpass[i] d1 = dist[u][W+1] d2 = dist[v+W][1] shared = dist[u][v+W] new_dist = (d1 + d2 - 2*shared + 1) / 2 res.append(new_dist) print("Case #{}: {}".format(case_num, " ".join("{:.6f}".format(d) for d in res))) T = int(input()) for i in range(T): W, E, C = map(int, input().split()) adj_w = defaultdict(list) adj_e = defaultdict(list) for u, v in zip(range(1, W), map(int, input().split())): adj_w[u].append(v) adj_w[v].append(u) for u, v in zip(range(1, E), map(int, input().split())): adj_e[u+W].append(v+W) adj_e[v+W].append(u+W) overpass = [tuple(map(int, input().split())) for _ in range(C)] solve_case(i+1, W, E, C, adj_w, adj_e, overpass)