Codeforces 553D Nudist Beach(二分答案 + BFS)
题目链接 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$为二分次数
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const double eps = 1e-8; const int N = 100010;
int n, m, k;
vector <int> v[N];
int deg[N], irr[N], b[N], c[N], g[N], inn[N], ans[N];
int cnt = 0; bool check(double x){ int num = cnt;
queue <int> Q;
rep(i, 1, cnt) g[c[i]] = 1;
rep(i, 1, cnt) inn[c[i]] = deg[c[i]] - irr[c[i]];
rep(i, 1, cnt){
if ((double)(inn[c[i]]) / (double)deg[c[i]] < x){
Q.push(c[i]);
g[c[i]] = 0;
--num;
}
} while (!Q.empty()){
int now = Q.front(); Q.pop();
for (auto u : v[now]) if (g[u]){
--inn[u];
if ((double)inn[u] / (double)deg[u] < x){
Q.push(u);
g[u] = 0;
--num;
}
}
} if (num){
int et = 0;
rep(i, 1, cnt) if (g[c[i]]) ans[++et] = c[i];
ans[0] = num;
return true;
} else return false;
} int main(){ scanf("%d%d%d", &n, &m, &k);
rep(i, 1, k){
int x;
scanf("%d", &x);
b[x] = 1;
} rep(i, 1, m){
int x, y;
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
++deg[x], ++deg[y];
if (b[x]) ++irr[y];
if (b[y]) ++irr[x];
} double l = 0.00, r = 1.00; cnt = 0;
rep(i, 1, n) if (!b[i]) c[++cnt] = i; rep(i, 1, 100){
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid - eps;
} printf("%d\n", ans[0]);
rep(i, 1, ans[0]) printf("%d ", ans[i]);
putchar(10); return 0;
}
Codeforces 553D Nudist Beach(二分答案 + BFS)的更多相关文章
- codeforces 553D . Nudist Beach 二分
题目链接 有趣的题. 给一个图, n个点m条边. 有k个点不可选择. 现在让你选出一个非空的点集, 使得点集中strength最小的点的strength最大. strength的定义:一个点周围的点中 ...
- Codeforces 553D Nudist Beach(图论,贪心)
Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...
- [Codeforces 1199C]MP3(离散化+二分答案)
[Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...
- {POJ}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...
- 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 ...
- 2018.12.08 codeforces 939E. Maximize!(二分答案)
传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...
- 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 ...
- [USACO2003][poj2110]Mountain Walking(二分答案+bfs)
http://poj.org/problem?id=2110 题意:给你一个n*n矩形(n<=100),每个位置上都有一个数字代表此处山的高度,要从(1,1)走到 (n,n),要求一条路径使得这 ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
随机推荐
- 如何用纯 CSS 和 D3 创作一艘遨游太空的宇宙飞船
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMqNmv 可交互视频 ...
- Word 借助VBA一键实现插入交叉引用
最近写论文的时候,经常需要向上或向下插入题注的交叉引用,word 自带的界面往往需要操作多次,才能实现插入.而平时使用较多的只是交叉引用附近的题注,比如如图1.1所示,在图1.1中等,距离较远的引用则 ...
- Applied Nonparametric Statistics-lec2
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/3 The Binomial Distributio ...
- perl-tips-1
.pm 应该保存 Perl Module,也就是 Perl 模块.例如 Socket.pm.pl 应该保存 Perl Library,也就是 Perl 库文件.例如 perldb.pl.plx 应该保 ...
- 牛客网暑期ACM多校训练营(第七场)A Minimum Cost Perfect Matching(找规律)
题意: 给定n, 求一个0~n-1的全排列p, 使得的和最小 分析: 打表发现最优解肯定是和为0的, 然后如果为2的幂就是直接反转即可, 不然的话就要分开从前面到后面逐步拆分, 具体思想模拟一下n = ...
- (转)减少oracle sql回表次数 提高SQL查询性能
要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块. 我们大家都 ...
- selenium2元素定位Xpath和cssSelector
Selenium2中元素有以下几种定位方法, 常用的有Id,xpath, cssSelector XPATH介绍: XPATH是一种选择器 XPATH在firefox中用firepath验证 XP ...
- Leetcode36--->Valid Sudoku(判断给定的数独是否有效)
题目:给定一个数独,某些部分已经被填上了数字,其余空的地方用‘.’表示:判断给定的数独是否有效: 数独规则: 每一行不能有重复的数字:每一列不能有重复的数字:将数独框划分为三行三列,没9个小方格不能有 ...
- 添加rpmforge源 centos 7
(原创)RHEL/CentOS 7.x使用EPEL第三方yum源 时间 2014-07-22 19:45:50 服务器运维与网站架构 原文 http://www.ha97.com/5649.html ...
- 分区脚本(fdisk)
#!/bin/bash echo "np w" | fdisk /dev/sdc && mkfs -t /dev/sdc1