Soltion:
就是怎么求最大团的问题:
以下是(O(7000 imes n^2))的做法
求一个最大团,然后将所有的药水平均分配,到最大团的所有点上,计算答案.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=40;
int n,k;
int G[MAXN+10][MAXN+10];
int lst[MAXN+10];
bool vis[MAXN+10];
inline int doit()
{
int res=0;
for(int i=1;i<=n;++i)vis[i]=false;
for(int i=1;i<=n;++i)
{
bool flag=true;
for(int j=1;j<i;++j)
{
if(!vis[j])continue;
if(!G[lst[i]][lst[j]])
{
flag=false;
break;
}
}
if(flag){vis[i]=true;++res;}
}
return res;
}
int main()
{
srand(5201314);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&G[i][j]);
for(int i=1;i<=n;++i)lst[i]=i;
int sz=0;
for(int i=1;i<=10000;++i)
{
random_shuffle(lst+1,lst+1+n);
sz=max(sz,doit());
}
printf("%.16lf",(double)k*k/sz*(sz-1)*0.5);
return 0;
}
事实上只要rand7000次就够啦...但我rand了10000次