E-小红的陡峭值
题目链接:https://ac.nowcoder.com/acm/contest/103152/E
题意:
给定一棵树,规定其陡峭值为两两相邻节点之差的绝对值之和,求砍掉一条边后,两颗子树的陡峭值之差的最小值
思路:
先dfs,将每颗子树的陡峭值算出来。
总陡峭值tot为子树的陡峭值之和
然后枚举每条边,删除掉,那么两颗子树的陡峭值分别为一开始记录的值(较小的那个),tot-另外一颗子树记录的值-abs(u-v)
记得开ll
vector<int>e[maxn];
int cnt[maxn];
void dfs(int u,int fa){
for(int v:e[u]){
if(v==fa)continue;
cnt[u]+=abs(u-v);
dfs(v,u);
cnt[u]+=cnt[v];
}
}
void solve(){
int n;cin>>n;
set<pii>st;
for(int i=1;i<=n-1;i++){
int u,v;cin>>u>>v;
e[u].pb(v);e[v].pb(u);
st.insert({u,v});
}
dfs(1,0);
int tot=cnt[1];
int ans=llmax;
for(auto edge:st){
int u=edge.fi,v=edge.se;
int a,b;
if(cnt[u]<=cnt[v]){
a=cnt[u],b=tot-cnt[u]-abs(u-v);
}else{
a=cnt[v],b=tot-cnt[v]-abs(u-v);
}
ans=min(ans,abs(a-b));
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号