Codeforces 553D Nudist Beach(图论,贪心)
2015-06-29 22:43
393 查看
Solution:
假设已经选了所有的点。
如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变。
如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点。
所以每次删掉一个点都记录一次最大值。取最大的情况输出就好。
View Code
假设已经选了所有的点。
如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变。
如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点。
所以每次删掉一个点都记录一次最大值。取最大的情况输出就好。
#include <bits/stdc++.h> using namespace std; const int N = 100009; vector<int> E , out; set<pair<double, int>> s; int deg , vis , dg ; int n, m, k; int main() { ios::sync_with_stdio ( 0 ); cin >> n >> m >> k; for ( int i = 1, x; i <= k; ++i ) { cin >> x; vis[x] = 1; } for ( int i = 1, u, v; i <= m; ++i ) { cin >> u >> v; E[u].push_back ( v ), ++deg[u]; if ( !vis[v] ) ++dg[u]; E[v].push_back ( u ), ++deg[v]; if ( !vis[u] ) ++dg[v]; } for ( int i = 1; i <= n; ++i ) { if (!vis[i]) s.insert ( make_pair ( 1.*dg[i] / deg[i], i ) ); } double ans = -1; while (!s.empty() ) { auto it = *s.begin(); if (it.first > ans) { ans=it.first; out.clear(); for (auto &i : s) { out.push_back (i.second); } } s.erase (s.begin() ); vis[it.second] = 1; for (auto &i : E[it.second]) { if (!vis[i]) { s.erase (make_pair (1.*dg[i] / deg[i], i) ); --dg[i]; s.insert (make_pair (1.*dg[i] / deg[i], i) ); } } } cout << out.size() << endl; for (auto &i : out) { cout << i << " "; } }
View Code
相关文章推荐
- onServiceDisconnected的调用时机
- Android数据存车和访问
- 什么是框架
- android请求https(二)使用HttpClient 请求https
- 关于刷标辅助软件的制作
- 华为机试—竞赛 西安2016届校园招聘练习(A卷)
- Spring:aspectj
- Bad Code!Why?
- iproute2和tc的高级路由用法
- Summary Ranges —— LeetCode
- 用伪类清除浮动
- GCC几个选项学习
- 事务—EJB事务(CMT)
- 标准输入流输出流以及错误流
- 2015第27周一非结构化数据
- so库与系统硬件架构不符合异常
- 欧拉路径 提高篇 hiho第51周
- iproute2常用命令
- WPF——菜单栏及TabControl
- 通过浏览器直接打开iOS/Android App 应用程序 - Cundong's log - 开源中国社区