如题:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e5+114;
const int inf = 1e15+7;
vector<int> edge[maxn],road[maxn];
int top[maxn],son[maxn],sz[maxn],dep[maxn],fa[maxn][21];
int d[maxn][21];
int dfn[maxn],dfncnt;
unordered_map<int,int> w[maxn];
void dfs1(int u,int father){
dep[u]=dep[father]+1;
fa[u][0]=father;
for(int i=1;i<=18;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
d[u][0]=w[father][u];
for(int i=1;i<=18;i++) d[u][i]=min(d[u][i-1],d[fa[u][i-1]][i-1]);
dfn[u]=++dfncnt;
sz[u]=1;
for(int v:edge[u]){
if(v==father) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int tp){
top[u]=tp;
for(int v:edge[u]){
if(v==fa[u][0]) continue;
if(v==son[u]) dfs2(v,tp);
else dfs2(v,v);
}
}
int LCA(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]][0];
}
if(dep[u]<dep[v]) swap(u,v);
return v;
}
bool cmp(int x,int y){
return dfn[x]<dfn[y];
}
int dp[maxn];
int lg[maxn];
bool f[maxn];
int Min(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
int res=inf;
while(dep[u]>dep[v]) res=min(res,d[u][0]),u=fa[u][0];
return res;
}
void dfs3(int u,int father){
for(int v:road[u]){
if(v==father) continue;
dfs3(v,u);
if(f[v]==true) dp[u]+=Min(u,v);
else dp[u]+=min(dp[v],Min(u,v));
}
}
int n,m;
vector<int> vec;
unordered_set<int> s;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
lg[1]=0;
for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
for(int i=1;i<n;i++){
int u,v,val;
cin>>u>>v>>val;
edge[u].push_back(v);
edge[v].push_back(u);
w[u][v]=w[v][u]=val;
}
dfs1(1,0);
dfs2(1,1);
cin>>m;
for(int i=1;i<=m;i++){
int k;
cin>>k;
for(int j=1;j<=k;j++){
int x;
cin>>x;
f[x]=true;
vec.push_back(x);
s.insert(x);
}
s.insert(1);
vec.push_back(1);
sort(vec.begin(),vec.end(),cmp);
for(int i=0;i<vec.size()-1;i++){
s.insert(LCA(vec[i],vec[i+1]));
}
vec.clear();
for(int x:s) vec.push_back(x);
sort(vec.begin(),vec.end(),cmp);
for(int i=0;i<vec.size()-1;i++){
if(LCA(vec[i],vec[i+1])!=vec[i+1]) road[LCA(vec[i],vec[i+1])].push_back(vec[i+1]);
}
dfs3(1,0);
cout<<dp[1]<<'\n';
for(int x:vec) f[x]=false,dp[x]=0,road[x].clear();
vec.clear();
s.clear();
}
return 0;
}