求调试
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int n;
vector<int> v[N];
bool vis[N];
int ans = N; // 去掉重心后所有连通块中最大值
int f = N;
int dis[N];
int dfs(int u) { // 返回值是以u为根的子树的节点数
vis[u] = true;
int size = 0; // 存储去掉u的所有子树的最大节点数
int sum = 1; // 存放以u为根的子树的节点的个数
for(int i = 0; i < v[u].size(); i ++ ) {
int j = v[u][i];
if(!vis[j]) {
int s = dfs(j);
sum += s;
size = max(s, size); // 比较所有子树的节点数目
}
}
ans = min(ans, max(size, n - sum)); //比较去掉重心的子树的节点数目使其最小
if(ans == max(size, n - sum)) f = min(f, u);
return sum;
}
void dfsd(int u, int cnt) { //求取最短距离之和
vis[u] = true;
dis[u] = cnt;
for(int i = 0; i < v[u].size(); i ++ ) {
int j = v[u][i];
if(!vis[j]) {
dfsd(j, cnt + 1);
}
}
}
int main() {
cin >> n;
for(int i = 1; i < n; i ++ ) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1);
memset(vis, false, sizeof vis);
dfsd(f, 0);
int res = 0;
for(int i = 1; i <= n; i ++ ) {
res += dis[i];
// cout << dis[i] << endl;
}
// cout << ans << endl;
cout << f << ' ';
cout << res << endl;
return 0;
}