题解:
先猜结论:最后一定是均分最大团。
然后就是板了。。
#include <bits/stdc++.h>
#define rd(x) scanf("%d",&x)
#define LD long double
using namespace std;
const int N=42;
int n,k,mx;
int nv[N][N],Some[N][N],None[N][N];
inline void dfs(int st,int all,int sc,int nc) {
if(!sc) {if(!nc)mx=max(mx,all); return;}
int u=Some[st][1];
for(int e=1;e<=sc;e++) {
int v=Some[st][e];
if(nv[u][v]) continue;
int nsc=0,nnc=0;
for(int i=1;i<e;i++) if(nv[u][Some[st][i]] && nv[v][Some[st][i]]) Some[st+1][++nsc]=Some[st][i];
for(int i=e+1;i<=sc;i++) if(nv[v][Some[st][i]]) Some[st+1][++nsc]=Some[st][i];
for(int i=1;i<=nc;i++) if(nv[v][None[st][i]]) None[st+1][++nnc]=None[st][i];
dfs(st+1,all+1,nsc,nnc);
None[st][++nc]=v;
}
}
int main() {
rd(n), rd(k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
rd(nv[i][j]);
for(int i=1;i<=n;i++) Some[0][i]=i;
dfs(0,0,n,0);
LD ans=(LD)k/mx;
ans=ans*ans*mx*(mx-1)/2.0;
printf("%.10f",(double)ans);
}