Codeforces 839E Mother of Dragons(极大团)
【题目链接】 http://codeforces.com/contest/839/problem/E
【题目大意】
现在有一些点,现在你有k的液体,随意分配给这些点,
当两个点有边相连的时候,他们能产生分配的液体乘积之和的价值,问最大价值
【题解】
考虑相同液体分给两个相连的点的时候,根据不等式x+y<=2sqrt(xy)的取等条件,
一定是平均分的时候价值最大,考虑多个相连,完全图的时候产生价值更大,
因此答案一定是一个极大团,记团大小为ans,Ans=ans*(ans-1)/2*sqr(k/ans)
答案取决于(ans-1)/ans的大小,根据盐水加盐性质,答案正比于ans的大小,
所以求最大的极大团,也就是最大团用来计算答案是最优的。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
namespace BronKerbosch{
const int N=200;
int G[N][N],Allow[N][N],Forbid[N][N],Num[N][N],Ans;
void Initialize(int n){
Ans=0;
for(int i=1;i<=n;i++)Allow[1][i]=i;
memset(G,0,sizeof(G));
}
void Add_Edge(int x,int y){G[x][y]=G[y][x]=1;}
void Dfs(int x,int Nn,int An,int Fn){
if(!An&&!Fn){Ans=max(Ans,Nn);return;}
if(!An)return;
int key=Allow[x][1];
for(int j=1;j<=An;j++){
int v=Allow[x][j],tAn=0,tFn=0;
if(G[key][v])continue;
for(int i=1;i<=Nn;i++)Num[x+1][i]=Num[x][1]; Num[x+1][Nn+1]=v;
for(int i=1;i<=An;i++)if(G[v][Allow[x][i]])Allow[x+1][++tAn]=Allow[x][i];
for(int i=1;i<=Fn;i++)if(G[v][Forbid[x][i]])Forbid[x+1][++tFn]=Forbid[x][i];
Dfs(x+1,Nn+1,tAn,tFn);
Allow[x][j]=0; Forbid[x][++Fn]=v;
}
}
}
int n,K,x,y;
int main(){
while(~scanf("%d%d",&n,&K)){
using namespace BronKerbosch;
Initialize(n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&x);
if(x&&i!=j)Add_Edge(i,j);
}
}Dfs(1,0,n,0);
double res=0;
if(Ans>1)res=1.0*(Ans-1)/2.0/Ans;
printf("%.10f\n",res*K*K);
}return 0;
}
Codeforces 839E Mother of Dragons(极大团)的更多相关文章
- Codeforces 839E Mother of Dragons【__builtin_popcount()的使用】
E. Mother of Dragons time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...
- Codeforces 839E Mother of Dragons
题 OvO http://codeforces.com/contest/839/problem/E (Codeforces Round #428 (Div. 2) - E) 解 首先,k肯定是要平均分 ...
- CF839E Mother of Dragons 最大团 Bron-Kerbosch算法
题意简述 给你一个\(n\)个节点的无向图\(G=\{V,E\}\)的邻接矩阵\(g\)和每个点的点权为\(s_i\),且\(\sum_{i=1}^n s_i = K\),要你求出\(\mathrm{ ...
- 【CF839E】Mother of Dragons 折半状压
[CF839E]Mother of Dragons 题意:给你一张n个点,m条边的无向图.你有k点能量,你可以把能量分配到任意一些点上,每个点分到的能量可以是一个非负实数.定义总能量为:对于所有边&l ...
- POJ 2989 All Friends 极大团计数
POJ 2989 题意:给定一个无向图(节点数小于128)求极大团(不包含在更大的团中)的总数. 对最大团,极大团不熟悉的,建议先阅读最大团搜索问题 ZOJ 1492 再来看本题. 本题数据有限,可以 ...
- All Friends 极大团
搞懂了什么是团 什么是极大团 什么是最大团 极大团就是 不是任何团的真子集 最大团就是点数最多的极大团 这题就是求极大团的个数 用bk算法 #include <iostream> ...
- hdoj1373 Channel Allocation(极大团)
题意是有若干个接收器,给出每个接收器的相邻接收器.相邻的接收器不能使用同一信号频道.问所需要的信号频道数. 求该无向图的极大团. #include<iostream> #include&l ...
- Codeforces Round #428 (Div. 2)E. Mother of Dragons
http://codeforces.com/contest/839/problem/E 最大团裸题= =,用Bron–Kerbosch算法,复杂度大多博客上没有,维基上查了查大约是O(3n/3) 最大 ...
- codeforces527D
Clique Problem CodeForces - 527D 所谓图的极大团是指在一个无向图中找到最多的点,使得这些点构成的图(即导出子图)是一个完全图,然而这个问题至今没有有效的多项式解法,当然 ...
随机推荐
- 51Nod 1256 扩展欧几里得求乘法逆元
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...
- android Timer TimerTask用法笔记
Android中经常会遇到执行一些周期性定时执行的任务.初学的时候经常会使用Thread.sleep()方法.在android中,有Timer可以专门干这个事情. 先看看Timer.class中都是些 ...
- android 系统的休眠与唤醒+linux 系统休眠
Android休眠与唤醒驱动流程分析 标准Linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasks ...
- sicily 1240. Faulty Odometer
Description You are given a car odometer which displays the miles traveled as an integer. The odomet ...
- $fhqTreap$
- $fhqTreap$与$Treap$的差异 $fhqTreap$是$Treap$的非旋版本,可以实现一切$Treap$操作,及区间操作和可持久化 $fhqTreap$非旋关键在于分裂与合并$(Sp ...
- openjudge-NOI 2.6-2985 数字组合
题目链接:http://noi.openjudge.cn/ch0206/2985/ 题解: 跟背包问题有点相似,暂且算背包型DP吧,虽然是一道递推题…… fj表示和为j时的结果,得: 即为j减去每一个 ...
- 斐讯路由器L(联)B(壁)K-码兑换包安全下车通道(图文教程)
大家好,最近大家比较关心的斐讯路由器如何下车问题,楼主亲自试提取了一遍,记录下过程,欢迎大家一起讨论. 言归正传,上图,上图! No.1 打开斐讯提供的良心k码退换通道: https://tech-s ...
- Python如何实现文本转语音
准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了. 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相 ...
- 理解一条语句:SELECT difference(sum("value")) FROM "mq_enqueue" WHERE "channel" =~ /ActiveMQ_TEST/ AND $timeFilter GROUP BY time($interval)
最近使用grafana在查询InfluxDB中,用到了这一条语句 SELECT difference(sum("value")) FROM "mq_enqueue&quo ...
- 【PAT】1002. A+B for Polynomials (25)
1002. A+B for Polynomials (25) This time, you are supposed to find A+B where A and B are two polynom ...