题目链接
https://codeforces.com/contest/796/problem/D
题目大意
给你一颗包含 N 节点的树,其中有 K 个节点为关键点。
问在满足所有点和关键点的距离 <= d 的前提下最多可以删除多少条路径
解题思路
思维 + BFS
相对简单的一道题吧?
将每个关键点加入队列,一边进行BFS一边记录路径
直到所有点都被访问过再把没记录过的路径输出即可
AC_Coder
#include<bits/stdc++.h>
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define pb push_back
#define fi first
#define se second
#define int long long
using namespace std;
const int N = 3e5 + 10;
vector<pair<int , int>>mat[N];
int a[N];
queue<int>que;
int vis1[N] , vis2[N] , cnt , n , k , d , ans;
void bfs()
{
while(!que.empty())
{
int now = que.front();
que.pop();
if(cnt == n) break ;
for(auto i : mat[now])
{
if(vis1[i.fi] || vis2[i.se]) continue ;
vis1[i.fi] = 1 , vis2[i.se] = 1;
que.push(i.fi);
cnt ++ , ans ++ ;
}
}
}
signed main()
{
cin >> n >> k >> d;
rep(i , 1 , k)
{
cin >> a[i];
if(vis1[a[i]]) continue ;
cnt ++ , que.push(a[i]) , vis1[a[i]] = 1;
}
rep(i , 1 , n - 1)
{
int u , v;
cin >> u >> v;
mat[u].pb(make_pair(v , i)) , mat[v].pb(make_pair(u , i));
}
bfs();
cout << n - 1 - ans << '\n';
rep(i , 1 , n - 1)
if(!vis2[i]) cout << i << " ";
return 0;
}