rt
TLE啥的应该是我人傻常数大
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+5;
int k,n,m,tot,head[maxn],f[maxn][25],dfn[maxn],de[maxn],mi[maxn],b[maxn],dp[maxn],tp[maxn];
vector<int> g[maxn];
struct node
{
int v,nxt,w;
}e[maxn<<1];
void add(int x,int y,int w)
{
e[++tot].v=y;
e[tot].nxt=head[x];
head[x]=tot;
e[tot].w=w;
}
void dfs(int x,int fa)
{
dfn[x]=++tot;
de[x]=de[fa]+1;
f[x][0]=fa;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
if(v!=fa)
{
mi[v]=min(mi[x],e[i].w);
dfs(v,x);
}
}
}
void pre()
{
memset(mi,0x7f,sizeof mi);
dfs(1,1);
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
// cout<<"FUCKCCF"<<mi[7]<<endl;
}
int lca(int x,int y)
{
if(de[x]<de[y])
swap(x,y);
for(int i=20;i>=0;i--)
if(de[f[x][i]]>=de[y])
{
x=f[x][i];
}
if(x==y)
return x;
for(int i=20;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
int cmp(int s1,int s2)
{
return dfn[s1]<dfn[s2];
}
int q[maxn],top,bk[maxn];
void build()
{
memset(bk,0,sizeof bk);
top=0;
q[++top]=1;
for(int i=1;i<=k;i++)
{
if(b[i]!=1)
{
int l=lca(b[i],q[top]);
// cout<<"QWQ"<<b[i]<<' '<<q[top]<<"lca:"<<l<<endl;
if(l!=q[top])
{
while(dfn[q[top-1]]>dfn[l])
{
if(!bk[q[top-1]])
{
bk[q[top-1]]=1;
g[q[top-1]].clear();
}
g[q[top-1]].push_back(q[top]),--top;
}
if(q[top-1]!=l)
{
if(!bk[q[top-1]])
{
bk[q[top-1]]=1;
g[q[top-1]].clear();
}
g[q[top-1]].push_back(q[top]),q[top]=l;
}
else
{
if(!bk[l])
{
bk[l]=1;
g[l].clear();
}
g[l].push_back(q[top--]);
}
}
q[++top]=b[i];
}
}
for(int i=1;i<top;i++)
{
// cout<<q[i]<<endl;
if(!bk[q[i]])
{
bk[q[i]]=1;
g[q[i]].clear();
}
g[q[i]].push_back(q[i+1]);
}
}
void solve(int x)
{
if(!bk[x])
{
bk[x]=1;
g[x].clear();
}
int sum=0;
for(int i=0;i<g[x].size();i++)
{
int v=g[x][i];
// cout<<"###"<<x<<' '<<v<<endl;
solve(v);
sum+=dp[v];
}
if(tp[x])
{
dp[x]=mi[x];
return;
}
if(sum)
dp[x]=min(sum,mi[x]);
else
dp[x]=mi[x];
// cout<<"####"<<x<<' '<<mi[x]<<' '<<sum<<endl;
return;
}
signed main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
pre();
cin>>m;
for(int i=1;i<=m;i++)
{
// int k;
memset(tp,0,sizeof tp);
memset(dp,0x7f,sizeof dp);
cin>>k;
for(int j=1;j<=k;j++)
{
cin>>b[j];
tp[b[j]]=1;
}
sort(b+1,b+k+1,cmp);
// g.clear();
build();
solve(1);
cout<<dp[1]<<endl;
}
return 0;
}
/*
10
1 5 13
1 9 6
2 1 19
2 4 8
2 3 91
5 6 8
7 5 4
7 8 31
10 7 9
1
4 2 5 9 10
*/