题目链接 Nudist Beach

来源  Codeforces Round #309 (Div. 1) Problem D

题目大意:

给定一篇森林(共$n$个点),你可以在$n$个点中选择若干个构成一个集合$S$。

输入数据中会给定一些点,你不能选择这些点。

定义$S$中某城市的值:

令$A$= 该城市的在S中的邻居数量 $B$ = 该城市的所有邻居数量

那么$S$中该城市的值为$\frac{A}{B}$

定义$S$的比值为$S$中所有城市的值的最小值

题目的要求是让你确定集合$S$,使得$S$的比值最大

解题思路:

我们可以二分这个比值(在$0$到$1$之间)

然后进行check

check的时候,我们先把所有可以选择的点加入集合。

然后判断这个集合中有没有比值不符合当前check的点

如果有,删除这些不符合的点,并放入队列。

接下来在这些点的邻居中寻找有没有不符合题意的点

如果有,删除这些不符合的点,并放入队列。

就这样一直下去,直到没有点可以删除为止。

最后若集合不为空,则check函数返回true,否则返回false

时间复杂度 $O(Kn)$,$K$为二分次数

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7.  
  8. typedef long long LL;
  9.  
  10. const double eps = 1e-8;
  11.  
  12. const int N = 100010;
  13. int n, m, k;
  14. vector <int> v[N];
  15. int deg[N], irr[N], b[N], c[N], g[N], inn[N], ans[N];
  16. int cnt = 0;
  17.  
  18. bool check(double x){
  19.  
  20. int num = cnt;
  21. queue <int> Q;
  22. rep(i, 1, cnt) g[c[i]] = 1;
  23. rep(i, 1, cnt) inn[c[i]] = deg[c[i]] - irr[c[i]];
  24. rep(i, 1, cnt){
  25. if ((double)(inn[c[i]]) / (double)deg[c[i]] < x){
  26. Q.push(c[i]);
  27. g[c[i]] = 0;
  28. --num;
  29. }
  30. }
  31.  
  32. while (!Q.empty()){
  33. int now = Q.front(); Q.pop();
  34. for (auto u : v[now]) if (g[u]){
  35. --inn[u];
  36. if ((double)inn[u] / (double)deg[u] < x){
  37. Q.push(u);
  38. g[u] = 0;
  39. --num;
  40. }
  41. }
  42. }
  43.  
  44. if (num){
  45. int et = 0;
  46. rep(i, 1, cnt) if (g[c[i]]) ans[++et] = c[i];
  47. ans[0] = num;
  48. return true;
  49. }
  50.  
  51. else return false;
  52. }
  53.  
  54. int main(){
  55.  
  56. scanf("%d%d%d", &n, &m, &k);
  57. rep(i, 1, k){
  58. int x;
  59. scanf("%d", &x);
  60. b[x] = 1;
  61. }
  62.  
  63. rep(i, 1, m){
  64. int x, y;
  65. scanf("%d%d", &x, &y);
  66. v[x].push_back(y);
  67. v[y].push_back(x);
  68. ++deg[x], ++deg[y];
  69. if (b[x]) ++irr[y];
  70. if (b[y]) ++irr[x];
  71. }
  72.  
  73. double l = 0.00, r = 1.00;
  74.  
  75. cnt = 0;
  76. rep(i, 1, n) if (!b[i]) c[++cnt] = i;
  77.  
  78. rep(i, 1, 100){
  79. double mid = (l + r) / 2;
  80. if (check(mid)) l = mid;
  81. else r = mid - eps;
  82. }
  83.  
  84. printf("%d\n", ans[0]);
  85. rep(i, 1, ans[0]) printf("%d ", ans[i]);
  86. putchar(10);
  87.  
  88. return 0;
  89. }

Codeforces 553D Nudist Beach(二分答案 + BFS)的更多相关文章

  1. codeforces 553D . Nudist Beach 二分

    题目链接 有趣的题. 给一个图, n个点m条边. 有k个点不可选择. 现在让你选出一个非空的点集, 使得点集中strength最小的点的strength最大. strength的定义:一个点周围的点中 ...

  2. Codeforces 553D Nudist Beach(图论,贪心)

    Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...

  3. [Codeforces 1199C]MP3(离散化+二分答案)

    [Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...

  4. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  5. Codeforces 772A Voltage Keepsake - 二分答案

    You have n devices that you want to use simultaneously. The i-th device uses ai units of power per s ...

  6. 2018.12.08 codeforces 939E. Maximize!(二分答案)

    传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...

  7. Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

    Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...

  8. [USACO2003][poj2110]Mountain Walking(二分答案+bfs)

    http://poj.org/problem?id=2110 题意:给你一个n*n矩形(n<=100),每个位置上都有一个数字代表此处山的高度,要从(1,1)走到 (n,n),要求一条路径使得这 ...

  9. CH Round #72树洞[二分答案 DFS&&BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

随机推荐

  1. 《Spring源码深度解析》第三章 默认标签的解析

    上一章提到了,默认标签和自定义标签要分开解析.本章重点介绍默认标签的解析.在 DefaultBeanDefinitionDocumentReader 中: private void parseDefa ...

  2. 【Linux命令】nohup和&差异,查看进程和终止进程!

    最近在开发dueros的技能,官方提供的PHPSDK中有多个实力,而运行实例的命令如下是 nohup php -S 0.0.0.0:8029 myindex.php & 从命令来看,肯定是在8 ...

  3. 双击内容变input框可编辑,失去焦点后修改的数据异步提交

    <html> <head> <meta charset="utf8"> <script src="https://cdn.boo ...

  4. Python基础——异常

    捕捉所有异常 for i in range(10): try: input_number=input('write a number') if input_number=='q': break res ...

  5. Python基础——集合(set)

    集合可以去除掉列表中重复的元素. 创建 list1=[123,123,456,789] list1=set(list1) list1 set1=set() type(set1) set1=set([1 ...

  6. 2018 Python开发者大调查:Python和JavaScript最配?

    在2018年秋季,Python软件基金会与JetBrains发起了年度Python开发者调查. 报告的目的是寻找Python领域的新趋势,帮助开发者深入了解2018年Python开发者的现状. 该报告 ...

  7. drf 认证功能

    drf(django rest-framework)认证组件 复习 HyperlinkedIdentityField ​```python 功能:快速生成连接 1. publish = seriali ...

  8. markdown快捷键

    分组 功能 操作 快捷键 设置标题 一级标题 Heading1 Ctrl+1 二级标题 Heading2 Ctrl+2 三级标题 Heading3 Ctrl+3 四级标题 Heading4 Ctrl+ ...

  9. matlab画图颜色设置

    各种颜色属性选项选项意义选项意义'r' 红色 'm' 粉红'g' 绿色 'c' 青色'b' 兰色 'w' 白色'y' 黄色 'k' 黑色各种线型属性选项选项意义选项意义'-' 实线 '--' 虚线': ...

  10. ie9/8的iframe中jQuery报错

    此文章用于对工作中遇到的问题进行记录 jQuery 版本:1.9.1 按照一般的思路,jquery 1.x的是支持ie9及以下的,但是今天发现jquery报错了,代码错误位置在源码版本的第4888行 ...