# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1137072 | arijit_biswas | Traffic (IOI10_traffic) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> p, s, d;
vector<vector<int>> g;
vector<int> subtreeSum;
void dfs(int node, int par) {
subtreeSum[node] = p[node];
for (auto &v : g[node]) {
if (v != par) {
dfs(v, node);
subtreeSum[node] += subtreeSum[v];
}
}
}
bool check(int x) {
int maxTraffic = 1e9;
for (int i = 0; i < n; i++) {
int temp = 0;
for (auto &v : g[i]) {
subtreeSum.assign(n, 0);
dfs(v, i);
// for (auto &x : subtreeSum) {
// cout << x << " ";
// }
// cout << " -> " << subtreeSum[v] << endl;
temp = max(temp, subtreeSum[v]);
}
maxTraffic = min(maxTraffic, temp);
// cout << endl;
}
return maxTraffic <= x;
}
void solution() {
cin >> n;
p.resize(n);
s.resize(n - 1);
d.resize(n - 1);
for (int i = 0; i < n; i++) {
cin >> p[i];
}
for (int i = 0; i < n - 1; i++) {
cin >> s[i];
}
for (int i = 0; i < n - 1; i++) {
cin >> d[i];
}
g.resize(n);
for (int i = 0; i < n - 1; i++) {
g[s[i]].push_back(d[i]);
g[d[i]].push_back(s[i]);
}
int low = 1, high = 1000, ans = high;
while (low <= high) {
int mid = low + (high - low) / 2;
if (check(mid)) {
ans = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
cout << ans << endl;
// cout << check(30) << endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
solution();
}