寻找牛妹

最优题解

容易发现这是一棵树,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;
}
全部评论

相关推荐

三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务