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;
}
posted @ 2025-03-17 20:02  Marinaco  阅读(17)  评论(0)    收藏  举报
//雪花飘落效果