类似贪心,用 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; }