1 条题解

  • 0
    @ 2022-12-9 14:34:09

    先计算 dis[],再求距离和

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int val[105];//val[i]: i节点的人口数
    vector<int> e[105];
    int dis[105];
    //当前子树结点 u,当前子树的父节点 fa
    void dfs(int u,int fa){
        for(int i=0;i<e[u].size();i++)
        {
            int v=e[u][i];//u~v 为一条边
            if(v==fa)
                continue;//不能往父节点走
            dis[v]=dis[u]+1;
            dfs(v,u);
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++){
            int l,r;
            cin>>val[i]>>l>>r;
            // i~l i~r
            if(l!=0){
                e[i].push_back(l);
                e[l].push_back(i);
            }
            if(r!=0){
                e[i].push_back(r);
                e[r].push_back(i);
            }
        }
        //枚举用哪个点作为根节点最合适
        int ans=2147483647;
        for(int root=1;root<=n;root++){
            //处理dis数组(dis[i] 表示 i 到当前 root 的距离)
            dis[root] = 0;
            dfs(root, 0);
            //计算用root作为根结点的距离和
            int now=0;
            for(int i=1;i<=n;i++)
                now+=dis[i]*val[i];
            //尝试更新ans
            ans=min(ans,now);
        }
        cout<<ans<<"\n";
        return 0;
    }
    
    • 1

    信息

    ID
    557
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    34
    已通过
    25
    上传者