#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5;
vector<int> adj[maxn];
vector<int> a, id, chain;
void bfs(int st, vector<int>& node) {
queue<int> q;
q.push(st);
id[st] = st;
node.push_back(st);
while(!q.empty()){
int u = q.front();
q.pop();
for (int v : adj[u]) {
if(a[v] == 1 && id[v] == 0){
id[v] = st;
node.push_back(v);
q.push(v);
}
}
}
}
void bfs_distance(int st, unordered_map<int, int>& d) {
queue<int> q;
q.push(st);
d[st] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int v: adj[u]){
if(a[v] == 1 && d.find(v) == d.end() && id[v] == id[st]){
d[v] = d[u] + 1;
q.push(v);
}
}
}
}
bool smaller(pair<int, int> x, pair<int, int> y){
return x.first * y.second < y.first * x.second;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
for (int i = 1; i <= n - 1; i++){
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
a.resize(n + 1);
id.assign(n + 1, 0);
chain.assign(n + 1, 1);
for(int i = 1; i <= n; i++) cin >> a[i];
pair<int, int> res = {*min_element(a.begin() + 1, a.end()), 1};
int diam = 0;
for (int i = 1; i <= n; i++){
if(id[i] || a[i] != 1) continue;
vector<int> node;
bfs(i, node);
if(node.size() >= 2){
unordered_map<int, int> d, distu, distv;
bfs_distance(node[0], d);
int u = node[0];
for(auto [x, y]: d) if(y > d[u]) u = x;
bfs_distance(u, distu);
int v = u;
for(auto [x, y]: distu) if(y > distu[v]) v = x;
bfs_distance(v, distv);
for(int x: node) chain[x] = max(distu[x], distv[x]) + 1;
diam = max(diam, distu[v] + 1);
}
}
if(diam) res = {1, diam};
for (int v = 1; v <= n; v++){
if(a[v] > 1){
unordered_map<int, int> cmp;
for(int u: adj[v]){
if(a[u] > 1) continue;
if(cmp.find(id[u]) == cmp.end() || cmp[id[u]] < chain[u]) cmp[id[u]] = chain[u];
}
if(cmp.empty()) continue;
vector<int> val;
for(auto [x, y]: cmp) val.push_back(y);
pair<int, int> cand = {a[v], (1 + val[0] + (val.size() >= 2 ? val[1] : 0))};
if(smaller(cand, res)) res = cand;
}
}
int x = gcd(res.first, res.second);
cout << res.first / x << "/" << res.second / x << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |