思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵。其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即删除的边的条数是一定的。剩下就是为每个节点找根结点,考虑从所有警局出发得到到每个点的最短距离,则当前节点u,一定是从u->v,如果d[v] <= lim则这条边一定会保留。

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 3e5 + 5;
int vis[maxn], d[maxn];
int n, k, lim;map<PI, int>ha;
vector<int>G[maxn];
queue<int>q;int main() {while(scanf("%d%d%d", &n, &k, &lim) == 3) {ha.clear();while(!q.empty()) q.pop(); for(int i = 1; i <= n; ++i) G[i].clear();memset(d, -1, sizeof(d));int pos;for(int i = 0; i < k; ++i) {scanf("%d", &pos);d[pos] = 0;q.push(pos);}int u, v;for(int i = 0; i < n-1; ++i) {scanf("%d%d", &u, &v);ha[make_pair(u, v)] = i+1;ha[make_pair(v, u)] = i+1;G[u].push_back(v);G[v].push_back(u);}memset(vis, 0, sizeof(vis));int cnt = 0; //要保留的边的数量 while(!q.empty()) {int u = q.front(); q.pop();for(int i = 0; i < G[u].size(); ++i) {int v = G[u][i];if(d[v] == -1) {d[v] = d[u] + 1;q.push(v);if(d[v] <= lim) {int id = ha[make_pair(u, v)];vis[id] = 1;++cnt;}}}}printf("%d\n", n-cnt-1);//printf("%d\n", k-1);for(int i = 1; i <= n-1; ++i) {if(!vis[i]) printf("%d ", i);}printf("\n");}return 0;
} 

如有不当之处欢迎指出!

转载于:https://www.cnblogs.com/flyawayl/p/8305313.html

CodeForces - 796D Police Stations bfs相关推荐

  1. 96D - Police Stations

    96D - Police Stations 思路:bfs,从所有的警察局开始bfs,因为bfs的深度一样,而且题目给的树保证满足条件,所以不用考虑深度. 如果搜索到一个点a,他的下一个点b已经被搜索过 ...

  2. CodeForces - 1534E Lost Array(bfs+交互)

    题目链接:点击查看 题目大意:初始时给出一个长度为 nnn 的序列,每次可以询问 kkk 个位置的异或和,现在需要以最少的询问获得整个序列的异或和 题目分析:因为是异或,我们只关心每个位置被询问的次数 ...

  3. CodeForces - 1484D Playlist(循环链表+bfs)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,规定其是一个首尾相接的环,不断的遍历该环,如果满足 gcd(ai,ai+1)==1gcd(a_i,a_{i+1})==1gcd(ai​,a ...

  4. CodeForces - 1301F Super Jaber(bfs)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个颜色,颜色的种类不超过40种,如果想从一个点到达另一个点,有两种方法: 花费一个单位的时间从某种颜色闪现到相同的颜色 花费一个单位的时 ...

  5. Orac and Game of Life CodeForces - 1350E(思维+BFS)

    Please notice the unusual memory limit of this problem. Orac likes games. Recently he came up with t ...

  6. Valid BFS? CodeForces - 1037D(思维 bfs)

    我真是一只菜狗......emm... 题意: 判断一个从1开始的队列是否可以按照bfs的顺序 进行遍历..必须从1开始...然后后边依次是bfs顺序 解析: 看代码能看懂吧...emm...就是把每 ...

  7. Codeforces - 1176E - Cover it! - bfs

    https://codeforc.es/contest/1176/problem/E 久了不写bfs了.一开始用dfs写,的确用dfs是很有问题的,一些奇怪的情况就会导致多染一些色. 注意无向图的边要 ...

  8. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】

    961A - Tetris                                                模拟                                      ...

  9. codeforces 796A-D

    决定在 codeforces 练题啦,决定每个比赛刷前四道...太难就算了 796A Buying A House 题意:给出x轴上的n 个点,每个点有个权值,问离m 点最近的权值小于等于k 的点离m ...

最新文章

  1. 一个技术人的2016成长和2017小目标
  2. 低调的,我们改名字了!
  3. 如何在weblogic启动时让其加载指定的jar库文件
  4. linux下zookeeper启动命令,For Linux Zookeeper客户端命令行操作指令
  5. .net 下载文件几种方式
  6. 2016年1月书单推荐
  7. 终于从yahoo手中把域名抢救出来了
  8. Java数据库编程---JDBC操作步骤及数据库连接操作
  9. HUSTOJ安装记录
  10. 如何成为一名卓越的程序员
  11. 74cms php在那个文件夹里面,74cms后台getshell
  12. 小米9android q测试版,MIUI Android Q Beta优先体验版已推送:小米9可尝鲜
  13. 数字化转型没有银弹,不破不立,如何破?如何立?
  14. 魅蓝手机ROOT权限获取
  15. 老程序员告诉你人工智能工程师与Python工程师有什么区别?
  16. 代码管理工具—GitLab
  17. Java打印完整的堆栈信息
  18. WIN10笔记本禁用启用自带键盘
  19. USB简单介绍USB共享网络功能(一)
  20. 包载信使mRNA的多西环素纳米脂质体|雷公藤红素纳米脂质体RNA核糖核酸(实验原理)

热门文章

  1. 正则提取的url中的域名以及替换域名的方法 preg_match()和preg_replace()
  2. linux lnmp15 部署laravel项目
  3. Python学习第一天-第2节
  4. 使用 NodeJS+Express+MySQL 实现简单的增删改查
  5. Lombok 使用小结
  6. 《Adobe InDesign CS6中文版经典教程》—第1课1.5节修改文档的缩放比例
  7. jquery点击label触发2次的问题
  8. LeetCode(53):Maximum Subarray
  9. ActiveMQ学习笔记(2)——JMS消息模型
  10. Cantor定理的一种好表述