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

题解:

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

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

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

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

#include <bits/stdc++.h>
#define N 300006
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
vector<int>G;
queue<int>q;
int n,k,d,edges,vis[N],hd[N],to[N<<1],nex[N<<1],U[N],V[N],dis[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d%d",&n,&k,&d);
for(i=1;i<=k;++i)
{
int x;
scanf("%d",&x);
vis[x]=x,q.push(x);
}
for(i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v), add(u,v),add(v,u);
U[i]=u, V[i]=v;
}
for(;!q.empty();)
{
int u=q.front();q.pop();
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(!vis[v] && dis[u]+1<=d)
{
vis[v]=vis[u];
dis[v]=dis[u]+1;
q.push(v);
}
}
}
for(i=1;i<n;++i)
{
if(vis[U[i]]!=vis[V[i]])
{
G.push_back(i);
}
}
printf("%d\n",G.size());
for(i=0;i<G.size();++i) printf("%d ",G[i]);
return 0;
}

  

最新文章

  1. androidstudio 常用快捷键
  2. String的内存分配
  3. ADF_ADF Faces系列3_ADF数据可视化组件简介之建立Master-Detail
  4. CSS3 总结-2
  5. iOS调用相机,相册,上传头像 分类: ios技术 2015-04-14 11:23 256人阅读 评论(0) 收藏
  6. Linux系列教程(十四)——Linux用户和用户组管理之相关配置文件
  7. Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址
  8. Python3 系列之 基础语法篇
  9. Python3个人学习笔记--每天一点一滴成长!
  10. CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
  11. 5 -- Hibernate的基本用法 --4 1 创建Configuration对象
  12. 30分钟了解Shiro与Springboot的多Realm基础配置
  13. [don&#39;t have permission to access]的一个经典原因
  14. React Diff 算法
  15. Build 2016: 发布明天的云创新来服务今天的开发者
  16. Android推送方案
  17. 12c可插拔数据库CDB与PDB管理总结
  18. 日常-acm-子序列的和
  19. Gym - 101291C (很有意思的最短路)
  20. [读书笔记]流畅的Python(Fluent Python)

热门文章

  1. linux运维命令3
  2. qt聊天室bug-- error: no matching function for call to &#39;Ui::Widget::setupUi(Widget*)&#39; ui-&gt;setupUi(this); ^
  3. MarkdownPad2安装与破解-转载
  4. (二)Lucene之根据关键字搜索文件
  5. (三)springmvc之注解的基本使用
  6. Python练习_集合和深浅拷贝_day7
  7. React/动态绑定class
  8. js大数计算之展示
  9. JavaScript知识点:分支结构(if、switch)+算法例题
  10. centos 6升级 GCC 到4.8