CodeForces - 796D Police Stations bfs
思路:删除尽量多的边使得所有点都能在限制距离之内到达一个警局,删除边会形成多棵子树,最多只能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相关推荐
- 96D - Police Stations
96D - Police Stations 思路:bfs,从所有的警察局开始bfs,因为bfs的深度一样,而且题目给的树保证满足条件,所以不用考虑深度. 如果搜索到一个点a,他的下一个点b已经被搜索过 ...
- CodeForces - 1534E Lost Array(bfs+交互)
题目链接:点击查看 题目大意:初始时给出一个长度为 nnn 的序列,每次可以询问 kkk 个位置的异或和,现在需要以最少的询问获得整个序列的异或和 题目分析:因为是异或,我们只关心每个位置被询问的次数 ...
- CodeForces - 1484D Playlist(循环链表+bfs)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,规定其是一个首尾相接的环,不断的遍历该环,如果满足 gcd(ai,ai+1)==1gcd(a_i,a_{i+1})==1gcd(ai,a ...
- CodeForces - 1301F Super Jaber(bfs)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个颜色,颜色的种类不超过40种,如果想从一个点到达另一个点,有两种方法: 花费一个单位的时间从某种颜色闪现到相同的颜色 花费一个单位的时 ...
- 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 ...
- Valid BFS? CodeForces - 1037D(思维 bfs)
我真是一只菜狗......emm... 题意: 判断一个从1开始的队列是否可以按照bfs的顺序 进行遍历..必须从1开始...然后后边依次是bfs顺序 解析: 看代码能看懂吧...emm...就是把每 ...
- Codeforces - 1176E - Cover it! - bfs
https://codeforc.es/contest/1176/problem/E 久了不写bfs了.一开始用dfs写,的确用dfs是很有问题的,一些奇怪的情况就会导致多染一些色. 注意无向图的边要 ...
- Codeforces 题目合集+分类+代码 【Updating...】【361 in total】
961A - Tetris 模拟 ...
- codeforces 796A-D
决定在 codeforces 练题啦,决定每个比赛刷前四道...太难就算了 796A Buying A House 题意:给出x轴上的n 个点,每个点有个权值,问离m 点最近的权值小于等于k 的点离m ...
最新文章
- 一个技术人的2016成长和2017小目标
- 低调的,我们改名字了!
- 如何在weblogic启动时让其加载指定的jar库文件
- linux下zookeeper启动命令,For Linux Zookeeper客户端命令行操作指令
- .net 下载文件几种方式
- 2016年1月书单推荐
- 终于从yahoo手中把域名抢救出来了
- Java数据库编程---JDBC操作步骤及数据库连接操作
- HUSTOJ安装记录
- 如何成为一名卓越的程序员
- 74cms php在那个文件夹里面,74cms后台getshell
- 小米9android q测试版,MIUI Android Q Beta优先体验版已推送:小米9可尝鲜
- 数字化转型没有银弹,不破不立,如何破?如何立?
- 魅蓝手机ROOT权限获取
- 老程序员告诉你人工智能工程师与Python工程师有什么区别?
- 代码管理工具—GitLab
- Java打印完整的堆栈信息
- WIN10笔记本禁用启用自带键盘
- USB简单介绍USB共享网络功能(一)
- 包载信使mRNA的多西环素纳米脂质体|雷公藤红素纳米脂质体RNA核糖核酸(实验原理)
热门文章
- 正则提取的url中的域名以及替换域名的方法 preg_match()和preg_replace()
- linux lnmp15 部署laravel项目
- Python学习第一天-第2节
- 使用 NodeJS+Express+MySQL 实现简单的增删改查
- Lombok 使用小结
- 《Adobe InDesign CS6中文版经典教程》—第1课1.5节修改文档的缩放比例
- jquery点击label触发2次的问题
- LeetCode(53):Maximum Subarray
- ActiveMQ学习笔记(2)——JMS消息模型
- Cantor定理的一种好表述