题目链接: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;
}