CF796D Police Stations BFS+染色
2024-09-01 13:23:48
题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $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;
}
最新文章
- androidstudio 常用快捷键
- String的内存分配
- ADF_ADF Faces系列3_ADF数据可视化组件简介之建立Master-Detail
- CSS3 总结-2
- iOS调用相机,相册,上传头像 分类: ios技术 2015-04-14 11:23 256人阅读 评论(0) 收藏
- Linux系列教程(十四)——Linux用户和用户组管理之相关配置文件
- Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址
- Python3 系列之 基础语法篇
- Python3个人学习笔记--每天一点一滴成长!
- CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
- 5 -- Hibernate的基本用法 --4 1 创建Configuration对象
- 30分钟了解Shiro与Springboot的多Realm基础配置
- [don&#39;t have permission to access]的一个经典原因
- React Diff 算法
- Build 2016: 发布明天的云创新来服务今天的开发者
- Android推送方案
- 12c可插拔数据库CDB与PDB管理总结
- 日常-acm-子序列的和
- Gym - 101291C (很有意思的最短路)
- [读书笔记]流畅的Python(Fluent Python)
热门文章
- linux运维命令3
- qt聊天室bug-- error: no matching function for call to &#39;Ui::Widget::setupUi(Widget*)&#39; ui->;setupUi(this); ^
- MarkdownPad2安装与破解-转载
- (二)Lucene之根据关键字搜索文件
- (三)springmvc之注解的基本使用
- Python练习_集合和深浅拷贝_day7
- React/动态绑定class
- js大数计算之展示
- JavaScript知识点:分支结构(if、switch)+算法例题
- centos 6升级 GCC 到4.8