#include<bits/stdc++.h> usingnamespace std; using ll = longlong;
intmain(){ int J; cin >> J;
while (J--) { int n, s, t; cin >> n >> s >> t; s--; t--;
vector<vector<int>> E(n); for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--; v--; E[u].push_back(v); E[v].push_back(u); }
// 找到 s-t 路径上所有点 vector<int> vis(n), from(n, -1), path; auto dfs = [&](thisauto&& self, int u, int p) { if (u == s) { while (u != -1) { path.push_back(u); vis[u] = 1; u = from[u]; } } else for (auto v : E[u]) { if (v == p) continue; from[v] = u; self(v, u); } }; dfs(t, -1); vector<int> dep(n); for (int i = 0; i < path.size(); i++) { auto u = path[i]; set<pair<int, int>> s; auto dfs2 = [&](thisauto&& self, int u, int p) -> void { s.insert({ -dep[u], u }); for (auto v : E[u]) { if (v == p || vis[v]) continue; dep[v] = dep[u] + 1; self(v, u); } }; dfs2(u, -1); for (auto [_, u] : s) { cout << (u + 1) << " "; } } cout << endl; }
Z sum = 0; for (int i = 0; i < E[u].size(); i++) { auto v = E[u][i]; stay[i] = prod[v] * (1 - p[u]) / p[u]; fall[i] = wwww[v] - stay[i]; sum += fall[i]; }
vector<Z> p(n); for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; p[i] = Z(x) / y; }
vector<vector<int>> E(n); vector<pair<int, int>> edge; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--; v--; E[u].push_back(v); E[v].push_back(u); edge.push_back({ u, v }); }
vector<Z> prod(n, 1); vector<Z> wwww(n, 1); for (int u = 0; u < n; u++) { Z sum = 0; for (auto v : E[u]) { prod[u] *= p[v]; sum += (1 - p[v]) / p[v]; } prod[u] *= (1 - p[u]); wwww[u] = prod[u] * sum; }
Z res = 0; Z sum = 0; for (int u = 0; u < n; u++) { res += sum * wwww[u]; sum += wwww[u]; }
// 隔一个 for (int u = 0; u < n; u++) { vector<Z> stay(E[u].size()); vector<Z> fall(E[u].size());
Z sum = 0; for (int i = 0; i < E[u].size(); i++) { auto v = E[u][i]; stay[i] = prod[v] * (1 - p[u]) / p[u]; fall[i] = wwww[v] - stay[i]; sum += fall[i]; }
Z sumstay = 0; Z sumfall = 0; for (int i = 0; i < E[u].size(); i++) { res -= stay[i] * (sum - fall[i]);
res -= sumstay * stay[i]; res += sumstay * stay[i] / (1 - p[u]); sumstay += stay[i];
res -= sumfall * fall[i]; res += sumfall * fall[i] / (p[u]); sumfall += fall[i]; } }
// 挨着 for (auto [u, v] : edge) { res -= wwww[u] * wwww[v]; res += prod[u] * prod[v] / p[u] / p[v]; }