func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   int m;   struct st {     int dp;     int maxt;     int cnt;     bool use;     st() {       dp = maxt = cnt = 0;       use = false;     }   };   vector<st> dp[123457];   vector<int> v[123457];   vector<int> nex[123457];   bool oc[123457];   bool visited[123457];   pair<int, int> max1[123457];   pair<int, int> max2[123457];   int sum_cnt[123457];   int not_contain[123457];   int dpp[123457];   inline void dfs(int a, int b) {     if (dp[a][b].use) {       return;     }     dp[a][b].use = true;     if (visited[a]) {       dp[a][b].cnt = sum_cnt[a];       dp[a][b].dp = dpp[a];       dp[a][b].maxt = max1[a].first;       if (max1[a].second == b) {         dp[a][b].maxt = max2[a].first;       }       dp[a][b].use = true;       if (dp[v[a][b]][nex[a][b]].cnt) {         dp[a][b].dp -= dp[v[a][b]][nex[a][b]].dp + 2;         dp[a][b].cnt -= dp[v[a][b]][nex[a][b]].cnt;       }       dfs(v[a][not_contain[a]], nex[a][not_contain[a]]);       if (dp[v[a][not_contain[a]]][nex[a][not_contain[a]]].cnt) {         dp[a][b].dp += dp[v[a][not_contain[a]]][nex[a][not_contain[a]]].dp + 2;         dp[a][b].cnt += dp[v[a][not_contain[a]]][nex[a][not_contain[a]]].cnt;         dp[a][b].maxt =             max(dp[a][b].maxt,                 dp[v[a][not_contain[a]]][nex[a][not_contain[a]]].maxt + 1);       }       return;     }     visited[a] = true;     if (oc[a]) {       dp[a][b].cnt++;     }     int siz = v[a].size();     pair<int, int> MA1 = make_pair(0, -1);     pair<int, int> MA2 = make_pair(0, -1);     for (int i = 0; i < siz; i++) {       if (i == b) {         continue;       }       int l = v[a][i];       int r = nex[a][i];       if (!dp[l][r].use) {         dfs(l, r);       }       if (dp[l][r].cnt) {         dp[a][b].cnt += dp[l][r].cnt;         if (dp[l][r].maxt + 1 > dp[a][b].maxt) {           dp[a][b].maxt = dp[l][r].maxt + 1;         }         pair<int, int> ne = make_pair(dp[l][r].maxt + 1, i);         if (ne > MA1) {           MA2 = MA1;           MA1 = ne;         } else {           if (ne > MA2) {             MA2 = ne;           }         }         dp[a][b].dp += dp[l][r].dp + 2;       }     }     sum_cnt[a] = dp[a][b].cnt;     not_contain[a] = b;     max1[a] = MA1;     max2[a] = MA2;     dpp[a] = dp[a][b].dp;   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i < n; i++) {       int a, b;       scanf( %d%d , &a, &b);       a--;       b--;       nex[a].push_back(v[b].size());       nex[b].push_back(v[a].size());       v[a].push_back(b);       v[b].push_back(a);     }     for (int i = 0; i < n; i++) {       dp[i].assign(v[i].size(), st());     }     for (int i = 0; i < m; i++) {       int a;       scanf( %d , &a);       a--;       oc[a] = true;     }     int ans = INT_MAX;     int ans_index = 0;     for (int i = 0; i < n; i++) {       int maxx = 0;       int sum = 0;       int siz = v[i].size();       for (int j = 0; j < siz; j++) {         int l = v[i][j];         int r = nex[i][j];         dfs(l, r);         if (dp[l][r].cnt) {           if (dp[l][r].maxt + 1 > maxx) {             maxx = dp[l][r].maxt + 1;           }           sum += dp[l][r].dp + 2;         }       }       sum -= maxx;       if (ans > sum) {         ans = sum;         ans_index = i;       }     }     printf( %d n , ans_index + 1);     printf( %d n , ans);     return 0;   }   