求助
查看原帖
求助
930686
Florrer_A楼主2025/2/6 21:20

80pts 换根DP

#include<cstring>
#include<iostream>
using namespace std;
const int N = 2e6 + 10;
int n,u,v,size[N],dp[N],deep[N];
int h[N],ver[N],ne[N],idx;
void add(int u,int v){
	idx++,ver[idx] = v,ne[idx] = h[u],h[u] = idx;
}
void dfs2(int u,int father){
	size[u] = 1;
	deep[u] = deep[father] + 1;
	for(int i = h[u];i != -1;i = ne[i]){
		int j = ver[i];
		if(j == father){
			continue;
		}
		dfs2(j,u);
		size[u] += size[j];
	}
}
void dfs(int u,int father){
	for(int i = h[u];i != -1;i = ne[i]){
		int j = ver[i];
		if(j == father){
			continue;
		}
		dp[j] = dp[u] + n - 2 * size[j];
		dfs(j,u);
	}
}
int main(){
	cin >> n;
	memset(h,-1,sizeof(h));
	for(int i = 1;i < n;i++){
		cin >> u >> v;
		add(u,v),add(v,u);
	}
	for(int i = 1;i <= n;i++){
		dp[1] += deep[i];
	}
	dfs2(1,-1);
	dfs(1,-1);
	int ans = 0;
	for(int i = 1;i <= n;i++){
		ans = max(ans,dp[i]);
	}
	for(int i = 1;i <= n;i++){
		if(dp[i] == ans){
			cout << i;
			return 0;
		}
	}
	return 0;
}
2025/2/6 21:20
加载中...