题意简述

给你一个\(n\)个节点的无向图\(G=\{V,E\}\)的邻接矩阵\(g\)和每个点的点权为\(s_i\),且\(\sum_{i=1}^n s_i = K\),要你求出\(\mathrm{max} \{ \sum_{u,v \in E} s_u \times s_v\}\)

做法

设两个不相邻的点\(u\),\(v\)的点权为\(s_u\)和\(s_v\),令\(a_u = \sum_{g[u][i]=1} s_i, a_v=\sum_{g[v][i]=1} s_i\),此时这对点\((u,v)\)的贡献为\(a_us_u+a_vs_v\)。

  • 不妨设\(a_u\geq a_v\),若\(s_u=s_u+s_v,s_v=0\),\(ans\)并不会变小。

所以最优解一定包含选取一个团(完全图)。对于一个\(n\)个点的完全图,这个完全图的答案为\((\frac {K}{n})^2 \times \frac {n(n-1)}{2}\),所以本题的答案为\((\frac {K}{tot})^2 \times \frac {tot(tot-1)}{2}\),其中\(tot\)为最大团的大小。

我们采用\(Bron-Kerbosch\)算法来求最大团,采用dfs剪枝的方法,时间复杂度\(O\left( {1.14}^n \right)\)。


当然此题模拟退火也可以过,维护一个序列\({c_n}\),\(s_i=\frac {c_i}{\sum_j c_j}\)。对于序列进行随机的$\bmod $固定值(如\(100\))意义下的加减,如果更优则转移。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define ak *
#define in inline
#define db double
in char getch()
{
static char buf[1<<12],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<12,stdin),p1==p2)?EOF:*p1++;
}
char qwq;
#define gc() getchar()
in int read()
{
re cz=0,ioi=1;qwq=gc();
while(qwq<'0'||qwq>'9') ioi=qwq=='-'?~ioi+1:1,qwq=gc();
while(qwq>='0'&&qwq<='9') cz=(cz<<3)+(cz<<1)+(qwq^48),qwq=gc();
return cz ak ioi;
}
const int N=45;
int n,k,g[N][N],ans,cnt[N],ch[N];
bool dfs(re u,re nw)
{
ch[nw]=u;
if(nw>ans) return ans=nw,true;
for(re i,v=u+1;v<=n;v++)
{
if(!g[u][v]||nw+cnt[v]<=ans) continue;
for(i=1;i<=nw;i++)
if(!g[ch[i]][v]) break;
if(i>nw&&dfs(v,nw+1)) return true;
}
return false;
}
in int bron_kerbosch()
{
for(re i=n;i;i--) dfs(i,1),cnt[i]=ans;
return ans;
}
int main()
{
n=read();k=read();
for(re i=1;i<=n;i++)
for(re j=1;j<=n;j++)
g[i][j]=read();
re cnt=bron_kerbosch();
if(!cnt) return puts("0"),0;
db per=1.0*k/cnt,tot=cnt*(cnt-1)/2.0;
printf("%.8lf",tot*pow(per,2));
return 0;
}

CF839E Mother of Dragons 最大团 Bron-Kerbosch算法的更多相关文章

  1. Codeforces Round #428 (Div. 2)E. Mother of Dragons

    http://codeforces.com/contest/839/problem/E 最大团裸题= =,用Bron–Kerbosch算法,复杂度大多博客上没有,维基上查了查大约是O(3n/3) 最大 ...

  2. 【CF839E】Mother of Dragons 折半状压

    [CF839E]Mother of Dragons 题意:给你一张n个点,m条边的无向图.你有k点能量,你可以把能量分配到任意一些点上,每个点分到的能量可以是一个非负实数.定义总能量为:对于所有边&l ...

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

  4. Codeforces 839E Mother of Dragons(极大团)

    [题目链接] http://codeforces.com/contest/839/problem/E [题目大意] 现在有一些点,现在你有k的液体,随意分配给这些点, 当两个点有边相连的时候,他们能产 ...

  5. Codeforces 839E Mother of Dragons

    题 OvO http://codeforces.com/contest/839/problem/E (Codeforces Round #428 (Div. 2) - E) 解 首先,k肯定是要平均分 ...

  6. Project Euler 60: Prime pair sets

    素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数.例如,取出7和109,7109和1097都是素数.这四个素数的和是792,是具有这样性质的四个素数的最小的 ...

  7. POJ1419 Graph Coloring(最大独立集)(最大团)

                                                               Graph Coloring Time Limit: 1000MS   Memor ...

  8. Codeforces Round #428 (Div. 2) 题解

    题目链接:http://codeforces.com/contest/839 A. Arya and Bran 题意:每天给你一点糖果,如果大于8个,就只能给8个,剩下的可以存起来,小于8个就可以全部 ...

  9. 22. CTF综合靶机渗透(十五)

    靶机说明: Game of Thrones Hacking CTF This is a challenge-game to measure your hacking skills. Set in Ga ...

随机推荐

  1. soj#2402 「THUPC 2017」天天爱射击 / Shooting

    分析 按照被穿过多少次整体二分即可 代码 #include<bits/stdc++.h> using namespace std; #define lb(x) x&(-x) ],r ...

  2. 二:flask-debug模式详解

    debug模式的情况下可以抛出详细异常信息 新建一个脚本并运行 访问 此时是非debug模式,如果运行的时候代码报错了,是不会提示详细错误的,只会报服务器内部错误 开启debug模式,可以查看到详细错 ...

  3. Dataframe的索引问题

    1 两个Dataframe相加时,一定要注意索引是否对应再相加,利用这个特点有时可以先用set_index()将某些列置为索引列,再进行相加. import pandas as pd df1 = pd ...

  4. Linux mysql ERROR 1045 解决

    Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ...

  5. oracle 11g 数据库恢复技术 --rman catalog

    Oracle RMAN的catalog并不是指标备份恢复操作的一个必要组件,但oracle推荐使用该组件.启用之后,归档日志.备份集.镜像复制等备份信息的保存地点是RMAN资料库(catalog), ...

  6. 【Linux 应用编程】基础知识

    错误提示 Linux 提供的系统调用API,通常会在失败的时候返回 -1.如果想获取更多更详细的报错信息,需要借助全局变量 errno 和 perror 函数: #include <stdio. ...

  7. 【Qt开发】【Linux开发】调试记录:QFontDatabase::loadFromCache Error

    最近做嵌入式的Qt界面,在移植成功后遇到了一个问题:QFontDatabase::loadFromCache: Font path doesn't match.后面跟着便是两个路径. 解决方案就是对比 ...

  8. C++中的深拷贝和浅拷贝构造函数

    1,对象的构造在实际工程开发当中是相当重要的,C++ 中使用类就要创建对象,这 就涉及了对象的构造,本节课讲解对象的构造和内存操作方面的问题: 2,实际工程开发中,bug 产生的根源,必然的会有内存操 ...

  9. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  10. html中设置height=100%无效的问题

    设置height=100%(网页内容能够更好的适配各种屏幕大小) 第一种是设置某个单独的div元素   height=100%无效 原因很简单,所有基于本分比的尺寸必须基于父元素,而你如果没有设置父元 ...