利用vector保存信息 注意题目说了"1 ≤ a ≤ 10" 也就是说 每个vector变量里最多存10个元素就足够了 不然MLE
#include <bits/stdc++.h>
using namespace std;
struct node
{
int v;
int next;
};
node edge[200010];
vector <int> per[100010][20];
vector <int> pre[100010];
vector <int> ans;
int dp[100010][20];
int first[100010],deep[100010];
int n,m,num;
void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
return;
}
void dfs(int cur,int pre)
{
int i,v;
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(v!=pre)
{
dp[v][0]=cur;
deep[v]=deep[cur]+1;
dfs(v,cur);
}
}
return;
}
void init()
{
vector <int> ::iterator iter;
int i,j,k,t;
for(i=1;i<=n;i++)
{
sort(pre[i].begin(),pre[i].end());
pre[i].erase(unique(pre[i].begin(),pre[i].end()),pre[i].end());
}
for(i=1;i<=n;i++)
{
for(k=0;k<pre[i].size();k++)
{
per[i][0].push_back(pre[i][k]);
}
for(k=0;k<pre[dp[i][0]].size();k++)
{
per[i][0].push_back(pre[dp[i][0]][k]);
}
sort(per[i][0].begin(),per[i][0].end());
per[i][0].erase(unique(per[i][0].begin(),per[i][0].end()),per[i][0].end());
iter=per[i][0].begin(),t=per[i][0].size();
for(k=0;k<min(t,10);k++) iter++;
per[i][0].erase(iter,per[i][0].end());
}
for(j=1;j<=log2(n);j++)
{
for(i=1;i<=n;i++)
{
dp[i][j]=dp[dp[i][j-1]][j-1];
for(k=0;k<per[i][j-1].size();k++)
{
per[i][j].push_back(per[i][j-1][k]);
}
for(k=0;k<per[dp[i][j-1]][j-1].size();k++)
{
per[i][j].push_back(per[dp[i][j-1]][j-1][k]);
}
sort(per[i][j].begin(),per[i][j].end());
per[i][j].erase(unique(per[i][j].begin(),per[i][j].end()),per[i][j].end());
iter=per[i][j].begin(),t=per[i][j].size();
for(k=0;k<min(t,10);k++) iter++;
per[i][j].erase(iter,per[i][j].end());
}
}
return;
}
int getlca(int u,int v)
{
int i;
if(deep[u]<deep[v]) swap(u,v);
for(i=log2(n);i>=0;i--)
{
if(deep[dp[u][i]]>=deep[v])
{
u=dp[u][i];
}
}
if(u==v) return u;
for(i=log2(n);i>=0;i--)
{
if(dp[u][i]!=dp[v][i])
{
u=dp[u][i],v=dp[v][i];
}
}
return dp[u][0];
}
void solve(int u,int lca)
{
int i,j;
for(i=log2(n);i>=0;i--)
{
if(deep[dp[u][i]]>=deep[lca])
{
for(j=0;j<per[u][i].size();j++)
{
ans.push_back(per[u][i][j]);
}
u=dp[u][i];
}
}
return;
}
int main()
{
int q,i,u,v,c,t,lca;
scanf("%d%d%d",&n,&m,&q);
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(i=1;i<=m;i++)
{
scanf("%d",&c);
if(pre[c].size()<10)
{
pre[c].push_back(i);
}
}
deep[1]=1;
dfs(1,0);
init();
while(q--)
{
scanf("%d%d%d",&u,&v,&c);
lca=getlca(u,v);
ans.clear();
if(u==v)
{
t=pre[u].size();
cout<<min(t,c)<<" ";
for(i=0;i<min(t,c);i++)
{
cout<<pre[u][i]<<" ";
}
cout<<endl;
}
else
{
solve(u,lca);
solve(v,lca);
sort(ans.begin(),ans.end());
ans.erase(unique(ans.begin(),ans.end()),ans.end());
t=ans.size();
cout<<min(t,c)<<" ";
for(i=0;i<min(t,c);i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
return 0;
}