寻找牛妹
最优题解
容易发现这是一棵树,1为根。那么走到牛妹所在的x的最大花费相当于x的子树中的通道都不走,x到根节点的通道只走一次,其他通道全走两次。用sz[x]表示x子树中通道数量,dep[x]表示根到x的通道数量,那么对于特定的x,答案就是2n-2-2sz[x]-dep[x]
时间复杂度和空间复杂度都是
vector<int> g[200055]; int sz[200055], dep[200055]; void dfs(int u, int f){ sz[u] = 0; dep[u] = dep[f] + 1; for(int v: g[u]) if(v!=f) dfs(v, u), sz[u] += sz[v]+1; return; } vector<int> solve(int n, int m, vector<int> &u, vector<int>&v, vector<int> &x){ for(int i = 0; i <= n; ++i) g[i].clear(), dep[i] = sz[i] = 0; assert(u.size() == n-1 && v.size() == n-1 && x.size() == m ); for(int i = 0; i < n-1; ++i){ g[u[i]].push_back(v[i]); g[v[i]].push_back(u[i]); } dep[0] = -1; dfs(1, 0); vector<int>ans;ans.clear(); for(int i = 0; i < m; ++i){ ans.push_back(2*n-2-2*sz[x[i]]-dep[x[i]]); }return ans; }