题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $d$,求最多能删几条边 ?

题解:

考虑什么时候一条边可以被断开:这条边的两个端点被两个不同的警察局覆盖掉.

我们要设计一种染色方案,使得整棵树都被覆盖,且每个警察局覆盖的范围尽量小.

那么,我们可以使用 $BFS$ 算法,拓展到不超过 $d$ 的距离,然后染色就.

最后看一下哪些边的端点颜色不同即可.

  1. #include <bits/stdc++.h>
  2. #define N 300006
  3. #define setIO(s) freopen(s".in","r",stdin)
  4. using namespace std;
  5. vector<int>G;
  6. queue<int>q;
  7. int n,k,d,edges,vis[N],hd[N],to[N<<1],nex[N<<1],U[N],V[N],dis[N];
  8. void add(int u,int v)
  9. {
  10. nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
  11. }
  12. int main()
  13. {
  14. int i,j;
  15. // setIO("input");
  16. scanf("%d%d%d",&n,&k,&d);
  17. for(i=1;i<=k;++i)
  18. {
  19. int x;
  20. scanf("%d",&x);
  21. vis[x]=x,q.push(x);
  22. }
  23. for(i=1;i<n;++i)
  24. {
  25. int u,v;
  26. scanf("%d%d",&u,&v), add(u,v),add(v,u);
  27. U[i]=u, V[i]=v;
  28. }
  29. for(;!q.empty();)
  30. {
  31. int u=q.front();q.pop();
  32. for(int i=hd[u];i;i=nex[i])
  33. {
  34. int v=to[i];
  35. if(!vis[v] && dis[u]+1<=d)
  36. {
  37. vis[v]=vis[u];
  38. dis[v]=dis[u]+1;
  39. q.push(v);
  40. }
  41. }
  42. }
  43. for(i=1;i<n;++i)
  44. {
  45. if(vis[U[i]]!=vis[V[i]])
  46. {
  47. G.push_back(i);
  48. }
  49. }
  50. printf("%d\n",G.size());
  51. for(i=0;i<G.size();++i) printf("%d ",G[i]);
  52. return 0;
  53. }

  

CF796D Police Stations BFS+染色的更多相关文章

  1. CF796D Police Stations 思维

    Inzane finally found Zane with a lot of money to spare, so they together decided to establish a coun ...

  2. CodeForces - 796D Police Stations bfs

    思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能k棵.其实就是以每个警局为根结点,把整棵树划分为以警局为根结点的k棵树,说明要删除的边的数量就是k-1条,即 ...

  3. 96D - Police Stations

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

  4. Codeforces Round #408 (Div. 2) D - Police Stations

    地址:http://codeforces.com/contest/796/problem/D 题目: D. Police Stations time limit per test 2 seconds ...

  5. HDU 2444 二分图判断 (BFS染色)+【匈牙利】

    <题目链接> 题目大意: 有N个人,M组互相认识关系互相认识的两人分别为a,b,将所有人划分为两组,使同一组内任何两人互不认识,之后将两个组中互相认识的人安排在一个房间,如果出现单人的情况 ...

  6. 【Luogu】P1330封锁阳光大学(bfs染色)

    题目链接 这题恶心死我了. bfs染色,统计每个联通块两色的个数,ans加它们的最小值. #include<cstdio> #include<cctype> #include& ...

  7. XMU 1617 刘备闯三国之汉中之战 【BFS+染色】

    1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 6  Solved: 5[Submit][Status][Web B ...

  8. UVALive 3977 BFS染色

    这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先 ...

  9. Police Stations CodeForces - 796D (bfs)

    大意: 给定树, 有k个黑点, 初始满足条件:所有点到最近黑点距离不超过d, 求最多删除多少条边后, 使得原图仍满足条件. 所有黑点开始bfs, 贪心删边. #include <iostream ...

随机推荐

  1. spring cloud微服务实践一

    最近在学习spring框架.其中spring cloud在微服务方面很火,所以在学习过程中,也做一些记录. 注:这一个系列的开发环境版本为 java1.8, spring boot2.x, sprin ...

  2. element-ui 合并单元格的方法

    arraySpanMethod({ row, column, rowIndex, columnIndex }) { // 只合并区域位置          //columnIndex 横的第一列    ...

  3. 剑指offer(3)——二维数组中的查找

    题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路: 首先选取数组中右上 ...

  4. python __enter__ 与 __exit__的作用,以及与 with 语句的关系(转)

    https://blog.csdn.net/xc_zhou/article/details/80810111 python __enter__ 与 __exit__的作用,以及与 with 语句的关系

  5. 应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]

    一.报错现象 应用人员反馈连接不上数据库,连接报错. 我们使用PLSQL发现可以连接数据库,但是数据库DB Alert存在如下报错信息 DB AlertFri Oct :: Errors ): ORA ...

  6. Python练习_函数进阶_day10

    1. 1.作业 1,写函数,接收n个数字,求这些参数数字的和.(动态传参) 2,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? a=10 b=20 def test5(a,b): p ...

  7. 如何在含有json类型的字段上建立多列索引

    废话不多,直接上图 如 : 表结构如图           那么我想在这三个字段上建立一个唯一索引,目的是为了防止重复插入数据, 1.首先,说明一下 data中的json中,key为 tagID 和 ...

  8. python - pyxel 制作游戏

    之前看了一个项目,觉得还挺有意思的,是关于做一个像素风的游戏,现在,虚幻4,u3d,已经让游戏愈发的好看,好玩,曾经我们童年的像素风游戏,愈来愈少.所以,这里我们就回味下. Pyxel是一个pytho ...

  9. zabbix-自定义监控项

    一.自定义一个监控项 模板虽好,但是不能解决所有的监控,有些需要的监控项在模板中并没有,需要我们自己定义一个监控项,如何定义一个监控项呢?大概的流程是这样的几步 .在插件配置文件中定义一个key/va ...

  10. Mysql的管理

    Linux系统中:mysql进入的命令为mysql -u root -p +你的mysql密码. Mysql是如何添加用户呢? 在mysql命令行下,使用use mysql;进入mysql的数据库中. ...