求助
查看原帖
求助
743127
Wu1hong2shen4楼主2023/7/16 23:39

不开 O2 AC ,开 O2 全 T ,蒟蒻不知道怎么回事,望大佬解答

不开 O2

开 O2

#include <bits/stdc++.h>
using namespace std;

int n;

const int T = 5e4+10;
struct bian {
	int from,to,next;
}edge[T*2];
int cnt = 0;
int head[T];
void add(int u,int v) {
	cnt++;
	edge[cnt].from = u;
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt;
}

int size[T];

int dp[T];
void dfs(int hao,int pre) {
	if(hao != 1)
		dp[hao] = dp[pre]+n-size[hao]*2;
	
	int dian;
	for(int i = head[hao];i;i = edge[i].next) {
		dian = edge[i].to;
		if(dian == pre)
			continue;
		dfs(dian,hao);
	}
}

int ceng[T];
void dfs_ceng(int hao,int pre) {
	ceng[hao] = ceng[pre]+1;
	int dian;
	for(int i = head[hao];i;i = edge[i].next) {
		dian = edge[i].to;
		if(dian == pre)
			continue;
		dfs_ceng(dian,hao);
	}
}

int size_suan(int hao,int pre) {
	size[hao] = 1;
	int dian;
	for(int i = head[hao];i;i = edge[i].next) {
		dian = edge[i].to;
		if(dian == pre)
			continue;
		size_suan(dian,hao);
		size[hao] += size[dian];
	}
}

int ans(int hao) {
	int sum = 0;
	for(int i = 1;i <= n;i++)
		sum += (ceng[i]-1);
	return sum;
}

int main() {
	scanf("%d",&n);
	int u,v;
	for(int i = 1;i < n;i++) {
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	
	dfs_ceng(1,T-1);
	dp[1] = ans(1);
	size_suan(1,T-1);
	dfs(1,T-1);
	
	int hao = 0;
	int minn = 2139062143;
	for(int i = 1;i <= n;i++) {
		if(dp[i] < minn) {
			minn = dp[i];
			hao = i;
		}
	}
	
	printf("%d %d",hao,minn);
	return 0;
}
2023/7/16 23:39
加载中...