1 条题解
-
0
先计算 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
- 上传者