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 << '\n'; rep(i , 1 , n - 1) if(!vis2[i]) cout << i << " "; return 0; }
凡所不能将我击倒的,都将使我更加强大