intmain() { int n; cin >> n; vector<ll> a(n + 1); vector<vector<int>> G(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; G[u].push_back(v), G[v].push_back(u); } int rt; cin >> rt; vector<ll> dp(n + 1);
auto dfs = [&](auto dfs, int u, int fa) -> void { if (u != rt) a[u]--; vector<int> tmp; for (int v : G[u]) { if (v == fa) continue; dfs(dfs, v, u); tmp.push_back(v); } sort(tmp.begin(), tmp.end(), [&](int a, int b) { return dp[a] > dp[b]; }); for (int i = 0; i < tmp.size() && a[u]; i++) { dp[u] += dp[tmp[i]] + 2; a[u]--; } if (a[u]) { for (int v : tmp) { if (a[v]) { int t = min(a[v], a[u]); dp[u] += 2 * t; a[u] -= t; } } } }; dfs(dfs, rt, 0); cout << dp[rt] << endl; return0;