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 ...
随机推荐
- 【Shiro】调用doGetAuthenticationInfo进行认证成功之后,isAuthenticated是false的问题。
使用@Configuration配置shiro无状态登录时出现的问题,在subject.login之后当前线程重新绑定了一个假定subject,isAuthenticated. 这里自定义的访问拦截器 ...
- c# 输出不同时间的格式
C#时间/日期格式大全,C#时间/日期函数大全 有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2005-6-6 14:33:34 如果要换成成200506,06-2005,2005-6- ...
- ultraedit编辑器破解版下载
ultraedit一款功能丰富的网站建设软件,需要的朋友可以看看. 百度百科:UltraEdit 是一套功能强大的文本编辑器,可以编辑文本.十六进制.ASCII 码,完全可以取代记事本(如果电脑配置足 ...
- 深入理解FIFO(包含有FIFO深度的解释)——转载
深入理解FIFO(包含有FIFO深度的解释) FIFO: 一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行 ...
- How to setup multimedia on CentOS 7
You will need to also install the EPEL repository as nux-dextop depends on this for some of its pack ...
- CodeForce--Benches
A. Benches There are nn benches in the Berland Central park. It is known that aiai people are curr ...
- 像玩魔兽一样编程——谈VS2010键盘流
早年在学校里的时候,经常玩War3,那时候很痴迷,也经常看sky.moon的一些第一视角,有的时候也会模仿模仿...好吧,往事不堪回首,现在工作了,谈一谈.Net程序猿使用VS的键盘流,如果你不知道s ...
- python偏函数使用
偏函数依托于python functools模块.
- <node>……express的中间件……//
Express是一个基于Node.js平台的web应用开发框架,在Node.js基础之上扩展了web应用开发所需要的基础功能,从而使得我们开发Web应用更加方便.更加快捷. 中间件是什么? 中间件函数 ...
- django_orm操作
查询操作和性能优化 1.基本操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 增 models.Tb1.object ...