AC on #1 # 7
其余WA
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 100010;
vector<int> g[N];
int n;
int d[2][N];
int from[2][N];
int up[N];
int res = 1e9 , x , ans;
void dfs1(int u , int father){
d[0][u] = d[1][u] = 0;
for(auto node : g[u]){
int j = node , w = 1;
if(j == father) continue;
dfs1(j , u);
if(d[0][j] + w >= d[0][u]){
d[1][u] = d[0][u];
d[0][u] = d[0][j] + w;
from[1][u] = from[0][u];
from[0][u] = j;
}
else if(d[0][j] + w > d[1][u]){
d[1][u] = d[0][j] + w;
from[1][u] = j;
}
}
}
void dfs2(int u , int father){
for(auto node : g[u]){
int j = node , w = 1;
if(j == father) continue;
if(from[0][u] == j) up[j] = max(up[u] , d[1][u]) + w;
else up[j] = max(up[u] , d[0][u]) + w;
dfs2(j , u);
}
}
int vis[N];
int dist[N];
void dfs3(int u){
for(auto node : g[u]){
int j = node , w = 1;
if(!vis[j]){
dist[j] = dist[u] + w;
vis[j] = 1;
dfs3(j);
}
}
}
int main(){
cin >> n;
for(int i = 1;i < n;i++){
int u , v;
scanf("%d%d" , &u , &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(1 , -1);
dfs2(1 , -1);
for(int i = 1;i <= n;i++){
if(max(d[0][i] , up[i]) < res){
res = max(d[0][i] , up[i]);
x = i;
}
}
vis[x] = 1;
dist[x] = 0;
dfs3(x);
for(int i = 1;i <= n;i++) ans += dist[i];
cout << x << " " << ans << endl;
return 0;
}