Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs
题目:http://codeforces.com/contest/553/problem/D
在一个无向图中,有若干坏点,选择一个不包含坏点的集合,使得集合中p值最小的点的p值最大。一个点的p值=集合中与该点相连的点的个数 / 与改点相连的总点数.
思路:考虑到p值是0到1的实数值,可以二分这个最小值。每次判断当前pi是否可以成立,做法是bfs。首先把所有点加进集合中,把不符合情况的点从集合中删除,删除的时候会影响到其他点,所以要维护一个欲删除点的队列,也就是bfs一遍,记住更新答案。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
const double eps = 1e-8;
vector<int> g[N];
int n,m,k,vis[N];
int kill[N];
set<int> ss,ans_set;
set<int>::iterator it;
double ans = 0;
int tmp[N];int ok(double p){queue<int> q;ss.clear();memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){ss.insert(i);tmp[i] = g[i].size();if(kill[i]){vis[i] = 1;q.push(i);}}while(!q.empty()){int wt = q.front() ; q.pop();ss.erase(wt);for(int i=0;i<g[wt].size();i++){int u = g[wt][i];if(vis[u]) continue;tmp[u]--;double hc = 1.0*tmp[u]/g[u].size();if(hc<p){vis[u] = 1;q.push(u);}}}int fl = 1;for(it=ss.begin();it!=ss.end();it++)if(1.0*tmp[*it]/g[*it].size() < p){ fl = 0 ; break;}if(fl && ss.size()>0){if(p>ans){ans = p;ans_set = ss;}return 1;}return 0;
}int main(){cin >> n >> m >> k;ans_set.clear();memset(kill,0,sizeof(kill));for(int i=0;i<=n;i++) g[i].clear();for(int i=1;i<=k;i++){int x;scanf("%d",&x);kill[x] = 1;}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}int co = 0;double high=1.0 , low = 0.0;while(co<40){co++;double mid = (high + low)/2;if( ok(mid) ) low = mid;else high = mid;}if(ans_set.size()==0){cout<<1<<endl;for(int i=1;i<=n;i++) if(!kill[i]){cout<<i<<endl;break;}}else{cout<<ans_set.size()<<endl;for(it=ans_set.begin();it!=ans_set.end();it++)cout<<*it<<" ";cout<<endl;}return 0;
}
Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs相关推荐
- Codeforces Round #725 (Div. 3) G. Gift Set 二分
传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...
- Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs
传送门 文章目录 题意: 思路: 题意: n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路: 怎么感觉每场div3div3div3都有一个巧妙的图论题. 首先如果只有两 ...
- Codeforces Round #709 (Div. 1) B. Playlist 链表维护 + bfs
传送门 文章目录 题意: 思路: 题意: 思路: 紧跟刘爷脚步补题. 不难想到用链表维护下一个数是什么,这样就跟以前做过的一个题差不多了,首先将初始的时候删掉的点的前一个点即为题目中的AAA入队,让后 ...
- Codeforces Round #646 (Div. 2) E(贪心,bfs)
Codeforces Round #646 (Div. 2) E 题目大意: 给一棵树,每个节点有三个权值 A,B,C, (B,C为0或1),每次你可以花费 A[u] *k的代价让A子树中的任意 k ...
- Codeforces Round #309 (Div. 1)
A. Kyoya and Colored Balls 大意: 给定$k$种颜色的球, 第$i$种颜色有$c_i$个, 一个合法的排列方案满足最后一个第$i$种球的下一个球为第$i+1$种球, 求合法方 ...
- Codeforces Round #309 (Div. 2) A. Kyoya and Photobooks 字符串水题
A. Kyoya and Photobooks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- Codeforces Round #309 (Div. 2) C
题意: 就是给出总共同拥有k种颜色.每种颜色有ki种,排列必须满足第i+1种的最后一种颜色必须在第i种最后一种颜色的后面,其它颜色任意.总共同拥有多少种排列点的方法. 分析: 如果d[i]表示前i种的 ...
- Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs
B. Mike and Shortcuts 题目连接: http://www.codeforces.com/contest/689/problem/B Description Recently, Mi ...
- Codeforces Round #321 (Div. 2) Kefa and Company 二分
原题链接:http://codeforces.com/contest/580/problem/B 题意: 给你一个集合,集合中的每个元素有两个属性,$m_i,s_i$,让你求个子集合,使得集合中的最大 ...
最新文章
- 4个重要的量子理论实验综述
- 机器人抓矸石_基于机器视觉的多机械臂煤矸石分拣机器人系统研究
- 关于ECS设计以及MVC分层设计和组件化设计的思考和总结(这个标题就问你长不长)
- Win10如何找出占用硬盘空间大的文件及怎么删除
- ROS服务通信机制原理及示例代码
- Rabbits —— HDU-6227
- .NET Core2.0 使用EF做数据操作
- python导入turtle报错_由于“未定义宽度错误”,我无法将turtle模块导入Python2.7.10...
- 用线性同余法生成伪随机数
- ExtJS EditorGridPanel 示例之JSON格式Store前后台增删改查
- 中级计算机平面设计考试题,平面设计师(中级)技能试题答案
- 小扎爆料:当年为了结婚,差点让Facebook提前上市
- android 闪屏动态界面,Android实现闪屏欢迎界面
- 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
- 我们与专家讨论了JavaScript –文字记录
- 银行卡在ATM机器上插入后显示IC磁条芯片卡拒绝交易解决办法
- 如何修改Adobe Acrobat身份信息中的登录名
- userdel删除用户时候提示:userdel: user xx is currently logged in
- NAT与NAT穿透(一)
- 字母数字特殊字符部分unicode对照表