类似贪心,用 BFS 对树进行染色,然后枚举哪些边的两个端点颜色不同. 

code: 

#include <bits/stdc++.h>
#define N 300006
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
vector<int>G;
queue<int>q;
int n,k,d,edges,vis[N],hd[N],to[N<<1],nex[N<<1],U[N],V[N],dis[N];
void add(int u,int v)
{
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
int main()
{
    int i,j;
    // setIO("input");
    scanf("%d%d%d",&n,&k,&d);
    for(i=1;i<=k;++i)
    {
        int x;
        scanf("%d",&x);
        vis[x]=x,q.push(x);
    }
    for(i=1;i<n;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v), add(u,v),add(v,u);
        U[i]=u, V[i]=v;
    }
    for(;!q.empty();)
    {
        int u=q.front();q.pop();
        for(int i=hd[u];i;i=nex[i])
        {
            int v=to[i];
            if(!vis[v] && dis[u]+1<=d)
            {
                vis[v]=vis[u];
                dis[v]=dis[u]+1;
                q.push(v);
            }
        }
    }
    for(i=1;i<n;++i)
    {
        if(vis[U[i]]!=vis[V[i]])
        {
            G.push_back(i);
        }
    }
    printf("%d\n",G.size());
    for(i=0;i<G.size();++i) printf("%d ",G[i]);
    return 0;
}

  

01-24 20:31