题目

代码
#include<iostream>
#include<vector>
using namespace std;
const int N = 2e5 + 10;
typedef long long LL;
vector<vector<LL>> g;
vector<LL> s;
LL ans = 1e18;
void dfs1(int u, int f){
for (auto v : g[u]){
if (v != f){
dfs1(v, u);
s[u] += s[v] + abs(u - v);
}
}
}
void dfs2(int u, int f){
for (auto v : g[u]){
if (v != f){
dfs2(v, u);
long long up = s[1] - s[v] - abs(u - v);
ans = min(ans, abs(up - s[v]));
}
}
}
int main(){
int n;
cin >> n;
g = vector<vector<LL>>(n + 1);
s = vector<LL>(n + 1);
for (int i = 0; i < n - 1; i++){
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs1(1, 0);
dfs2(1, 0);
cout << ans;
return 0;
}
思路
> 两次dfs,第一次将每个节点的绝对值和算出来,第二次遍历每个节点并计算每个相邻节点之间的绝对值差值。
> dfs1处理操作:s[u] += s[v] + abs(u - v);
> dfs2处理操作:ans = min(ans, abs(s[1] - s[v] - abs(u - v) - s[v]);
