Codeforces 796D Police Stations

题目链接

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 << '
';
    rep(i , 1 , n - 1)
        if(!vis2[i]) cout << i << " ";
    return 0;
}
凡所不能将我击倒的,都将使我更加强大
原文地址:https://www.cnblogs.com/StarRoadTang/p/13026221.html