codeforces 553 D Nudist Beach
题意大概是。给出一个图,保证每一个点至少有一条边以及随意两点间最多一条边。非常显然这个图有众多点集,若我们给每一个点定义一个权值,那每一个点集都有一个最小权值点,如今要求出一个点集,这个点集的最小权值点尽可能的大。
某个子集中。点的权值是这样算的。在该子集中这个点的度除以该点在图中的度。
乍看上去似乎无从下手。
能够显然知道的是。每一个点在图中的权值是非常easy算出来的,那我们尝试从图中进行删点。使得当前图的最小权值点的权值变大,显然能够知道要删除最小权值点。为什么呢?由于若删除次小权值点,若次小权值点跟最小权值点有连边,那最小权值点还是新图的最小权值点。若没有连边,那新图的最小权值点也依然未变。
所以仅仅有删除最小权值点才有可能改变新图的最小权值点,也仅仅有这样能让新图的最小权值发生改变。
那么到这里就十分明显了,仅仅要每次删除当前图的最小权值点。那么必定能够枚举出一个新图。这个新图的点构成的点集正是我们要的答案。
于是这个题就能够做了,我是直接做了两次删除,第一次得出最大最小权值是多少,第二次枚举到一个新图的最小权值等于最大最小权值。那么非常显然这个新图的子集就是答案。
维护一个小堆就好了,时间复杂度是2(n+m)log(n+m)
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
using namespace std;
struct node
{
int no;
double val;
node(){}
node(int no,double val)
{
this->no=no;
this->val=val;
}
bool operator <(node one)const
{
return val>one.val;
}
};
priority_queue<node>q[2];
bool fb[100010],dl[100010];
vector<int>edge[100010];
int d[100010][2],dd[100010];
int main()
{
int n,m,k;
cin>>n>>m>>k;
int sum=k;
while(k--)
{
int t;
cin>>t;
fb[t]=1;
}
while(m--)
{
int a,b;
cin>>a>>b;
d[a][0]++;
d[b][0]++;
if(!fb[a])
d[b][1]++;
if(!fb[b])
d[a][1]++;
edge[a].push_back(b);
edge[b].push_back(a);
}
double mn=1e99;
for(int i=1;i<=n;i++)
if(!fb[i])
{
q[0].push(node(i,double(d[i][1])/d[i][0]));
mn=min(mn,double(d[i][1])/d[i][0]);
}
q[1]=q[0];
int flag=0;
for(int i=0;i<2;i++)
{
memset(dl,0,sizeof(dl));
memset(dd,0,sizeof(dd));
if(i==1&&flag==0)
break;
while(q[i].size())
{
node t=q[i].top();
q[i].pop();
if(dl[t.no])
continue;
if(i==1)
{
if(t.no==flag)
break;
sum++;
}
dl[t.no]=1;
if(i==0&&t.val>mn)
{
mn=t.val;
flag=t.no;
}
for(int j=0;j<edge[t.no].size();j++)
{
int v=edge[t.no][j];
if(dl[v]||fb[v])
continue;
dd[v]++;
q[i].push(node(v,double(d[v][1]-dd[v])/d[v][0]));
}
}
}
cout<<n-sum<<endl;
for(int i=1;i<=n;i++)
if(!fb[i]&&!dl[i])
cout<<i<<" ";
}
2 seconds
256 megabytes
standard input
standard output
Nudist Beach is planning a military operation to attack the Life Fibers. In this operation, they will attack and capture several cities which are currently under the control of the Life Fibers.
There are n cities, labeled from 1 to n,
and m bidirectional roads between them. Currently, there are Life Fibers in every city. In addition, there are k cities
that are fortresses of the Life Fibers that cannot be captured under any circumstances. So, the Nudist Beach can capture an arbitrary non-empty subset of cities with no fortresses.
After the operation, Nudist Beach will have to defend the captured cities from counterattack. If they capture a city and it is connected to many Life Fiber controlled cities, it will be easily defeated. So, Nudist Beach would like to capture a set of cities
such that for each captured city the ratio of Nudist Beach controlled neighbors among all neighbors of that city is as high as possible.
More formally, they would like to capture a non-empty set of cities S with no fortresses of Life Fibers. The strength of a city
is
defined as (number of neighbors of x in S)
/ (total number of neighbors of x). Here, two cities are called neighbors if they are connnected with a road. The goal is to maximize
the strength of the weakest city in S.
Given a description of the graph, and the cities with fortresses, find a non-empty subset that maximizes the strength of the weakest city.
The first line of input contains three integers n, m, k (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 100 000, 1 ≤ k ≤ n - 1).
The second line of input contains k integers, representing the cities with fortresses. These cities will all be distinct.
The next m lines contain the roads. The i-th
of these lines will have 2 integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi).
Every city will have at least one road adjacent to it.
There is no more than one road between each pair of the cities.
The first line should contain an integer r, denoting the size of an optimum set (1 ≤ r ≤ n - k).
The second line should contain r integers, denoting the cities in the set. Cities may follow in an arbitrary order. This line should
not contain any of the cities with fortresses.
If there are multiple possible answers, print any of them.
9 8 4
3 9 6 8
1 2
1 3
1 4
1 5
2 6
2 7
2 8
2 9
3
1 4 5
10 8 2
2 9
1 3
2 9
4 5
5 6
6 7
7 8
8 10
10 4
8
1 5 4 8 10 6 3 7
The first example case achieves a strength of 1/2. No other subset is strictly better.
The second example case achieves a strength of 1. Note that the subset doesn't necessarily have to be connected.
codeforces 553 D Nudist Beach的更多相关文章
- Codeforces 553D Nudist Beach(二分答案 + BFS)
题目链接 Nudist Beach 来源 Codeforces Round #309 (Div. 1) Problem D 题目大意: 给定一篇森林(共$n$个点),你可以在$n$个点中选择若干个构 ...
- Codeforces 553D Nudist Beach(图论,贪心)
Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...
- codeforces 553D . Nudist Beach 二分
题目链接 有趣的题. 给一个图, n个点m条边. 有k个点不可选择. 现在让你选出一个非空的点集, 使得点集中strength最小的点的strength最大. strength的定义:一个点周围的点中 ...
- codeforces 553 A Kyoya and Colored Balls
这个题.比赛的时候一直在往dp的方向想,可是总有一个组合数学的部分没办法求, 纯粹组合数学撸,也想不到办法-- 事实上,非常显然.. 从后往前推,把第k种颜色放在最后一个,剩下的k球.还有C(剩余的位 ...
- Codeforces Round #309 (Div. 1)
A. Kyoya and Colored Balls 大意: 给定$k$种颜色的球, 第$i$种颜色有$c_i$个, 一个合法的排列方案满足最后一个第$i$种球的下一个球为第$i+1$种球, 求合法方 ...
- Codeforces 599C Day at the Beach(想法题,排序)
C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunate ...
- Codeforces Round #332 (Div. 2) C. Day at the Beach 线段树
C. Day at the Beach Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/599/p ...
- Codeforces Round #326 (Div. 2) D. Duff in Beach dp
D. Duff in Beach Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/probl ...
- Codeforces Round #553 (Div. 2) D题
题目网址:http://codeforces.com/contest/1151/problem/D 题目大意:给出n组数对,(ai , bi),调整这n组数对的位置,最小化 ∑(ai*( i -1)+ ...
随机推荐
- 常见python快捷键
http://www.cnblogs.com/toutou/p/4778818.html Ctrl+/注释(取消注释)选择的行 Shift + Enter开始新行 Ctrl + Enter智能换行 T ...
- 使用SpringMVC参数传递时,解决get请求时中文乱码的问题
问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一, 我们需要把request.getParameter(“参数名”)获取到的字符串先 ...
- [python学习篇][廖雪峰][2]函数式编程
函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就 ...
- 【转】javascript操作Select标记中options集合
先来看看options集合的这几个方法:options.add(option)方法向集合里添加一项option对象:options.remove(index)方法移除options集合中的指定项:op ...
- 九度oj 题目1368:二叉树中和为某一值的路径
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...
- Python基础教程总结(二)
上周总结了一下Python的一些基本数据类型和用法.这次总结一下4-9章的内容,完后,赶紧学以致用吧. 5. 第四章——字典:当索引不好用时 字典是Python中唯一内建的映射类型.字典中的值并没有特 ...
- 关于后台返回excel文件的问题
一般情况ajax请求只能获取解析非流文件类型,而excel是流文件类型,这个时候获取到的数据会是一串乱码的字符串 想要下载这个excel文件,通过form表单模拟的方式可以解决 var form = ...
- C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指 ...
- spring和resteasy 的集成方式
spring和resteasy集成,三种主要的方式, 对于和jboss as7的集成不需要做任何工作,jboss默认集成了resteasy,只需要对业务pojo做一些jax-rs的注解标注即可.这里讲 ...
- GridView从行寻找到该控件,以及从该控件获知该行
原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] GridView从行寻找到该控件: protected void Button3_Click(object sen ...