题意大概是。给出一个图,保证每一个点至少有一条边以及随意两点间最多一条边。非常显然这个图有众多点集,若我们给每一个点定义一个权值,那每一个点集都有一个最小权值点,如今要求出一个点集,这个点集的最小权值点尽可能的大。

某个子集中。点的权值是这样算的。在该子集中这个点的度除以该点在图中的度。

乍看上去似乎无从下手。

能够显然知道的是。每一个点在图中的权值是非常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<<" ";
}
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

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.

Input

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 ≤ nai ≠ 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.

Output

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.

Sample test(s)
input
9 8 4
3 9 6 8
1 2
1 3
1 4
1 5
2 6
2 7
2 8
2 9
output
3
1 4 5
input
10 8 2
2 9
1 3
2 9
4 5
5 6
6 7
7 8
8 10
10 4
output
8
1 5 4 8 10 6 3 7
Note

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的更多相关文章

  1. Codeforces 553D Nudist Beach(二分答案 + BFS)

    题目链接 Nudist Beach 来源  Codeforces Round #309 (Div. 1) Problem D 题目大意: 给定一篇森林(共$n$个点),你可以在$n$个点中选择若干个构 ...

  2. Codeforces 553D Nudist Beach(图论,贪心)

    Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...

  3. codeforces 553D . Nudist Beach 二分

    题目链接 有趣的题. 给一个图, n个点m条边. 有k个点不可选择. 现在让你选出一个非空的点集, 使得点集中strength最小的点的strength最大. strength的定义:一个点周围的点中 ...

  4. codeforces 553 A Kyoya and Colored Balls

    这个题.比赛的时候一直在往dp的方向想,可是总有一个组合数学的部分没办法求, 纯粹组合数学撸,也想不到办法-- 事实上,非常显然.. 从后往前推,把第k种颜色放在最后一个,剩下的k球.还有C(剩余的位 ...

  5. Codeforces Round #309 (Div. 1)

    A. Kyoya and Colored Balls 大意: 给定$k$种颜色的球, 第$i$种颜色有$c_i$个, 一个合法的排列方案满足最后一个第$i$种球的下一个球为第$i+1$种球, 求合法方 ...

  6. Codeforces 599C Day at the Beach(想法题,排序)

    C. Day at the Beach One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunate ...

  7. 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 ...

  8. 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 ...

  9. Codeforces Round #553 (Div. 2) D题

    题目网址:http://codeforces.com/contest/1151/problem/D 题目大意:给出n组数对,(ai , bi),调整这n组数对的位置,最小化 ∑(ai*( i -1)+ ...

随机推荐

  1. selenium - 常用等待操作

    # 4. 等待操作 # 强制等待from time import sleepsleep(10) # 隐性等待# 设置最长等待时间,在这个时间在只要有个时间点加载完成,则执行下一步代码,比sleep智能 ...

  2. python week08 并发编程之多进程--实践部分

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  3. python基础补漏-09-反射

    isinstance class A: passclass B(A): pass b = B()print isinatance(b,A)issubclass 判断某一个类是不是另外一个类的派生类 # ...

  4. Diango路由控制

    路由的格式: #路由配置的格式: urls.py里面写 from diango.conf.urls import url urlpatterns = [ url(正则表达式,views视图函数,nam ...

  5. python闭包函数、装饰器

    闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...

  6. [adb 学习篇] adb常用命令

    https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...

  7. jQuery 样式操作、文档操作、属性操作的方法总结

    文档操作: addClass()             向匹配的元素添加指定的类名.after()                    在匹配的元素之后插入内容.append()         ...

  8. 用js判断浏览器类型及设备

    <!DOCTYPE html> <html> <head> <title>JS判断是什么设备是什么浏览器</title> <meta ...

  9. BZOJ 3489 A simple rmq problem ——KD-Tree

    考前写写板子. 用$(i,pre[i],nxt[i])$来描述一个点,然后就变成了区间求最值的问题. KD-Tree 由低维转向高维的方法,可以用来敲暴力. 剩下就是KD-Tree的基本操作了. #i ...

  10. bzoj 1857 三分套三分

    题目大意 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...