#include<iostream>#include<cstring>#include<vector>#include<algorithm>usingnamespace std;constint N =1e5+10;int n, m;
vector<int> G[N];int dep[N], id[N], fa[N], tot;int up[N][21];int s1[N], s2[N];voiddfs(int from,int x){id[x]= tot ++;fa[x]= from;dep[x]= dep[from]+1;for(int i =0; i <(int)G[x].size(); i ++)if(from != G[x][i])dfs(x, G[x][i]);return;}voidinit(){for(int i =1; i <= n; i ++)// 先跳0層up[i][0]= fa[i];for(int k =1; k <=20; k ++)// [1, 20]for(int i =1; i <= n; i ++)up[i][k]= up[up[i][k -1]][k -1];return;}boolcmp(int u,int v){return id[u]< id[v];}intlca(int a,int b){if(dep[a]< dep[b])swap(a, b);for(int k =20; k >=0; k --)// [20, 1]if(dep[up[a][k]]>= dep[b])a = up[a][k];if(a == b)return a;for(int k =20; k >=0; k --)// [20, 1]if(up[a][k]!= up[b][k]){a = up[a][k];b = up[b][k];}return up[a][0];}intmain(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while(cin >> n >> m){for(int i =1; i <= n; i ++) G[i].clear();// 清空tot =0;// 清空for(int i =0; i < n -1; i ++){int u, v;cin >> u >> v;G[u].push_back(v), G[v].push_back(u);}dfs(0,1);// dfs序,深度,父節(jié)點init();// 發(fā)展up數(shù)組while(m --){int k1, k2;cin >> k1;for(int i =0; i < k1; i ++) cin >> s1[i];cin >> k2;for(int i =0; i < k2; i ++) cin >> s2[i];sort(s1, s1 + k1, cmp);// 按dfs序排序sort(s2, s2 + k2, cmp);int i =0, j =0, ans =0;while(i < k1 && j < k2){ans =max(ans, dep[lca(s1[i], s2[j])]);// 注意的深度depif(id[s1[i]]> id[s2[j]]) j ++;else i ++;// 如果第一個集合的點的dfs序大于第二個中的dfs序,則選第二個中的dfs序更大}cout << ans << endl;}}return0;}與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖