#include<bits/stdc++.h>
using namespace std;
const int N=505,M=125005;
double q[N][N],b[N],x[N];
int ver[M],nex[M],star[M],head[N],tot;
int n,m;
int in[N];
double h[M];
void gaosixiaoyuan()
{
for(int i=1;i<=n;i++)
{
int j=i;
for(int k=i;k<=n;k++)
{
if(fabs(q[k][i])>fabs(q[j][i]))
{
j=k;
}
}
for(int k=1;k<=n+1;k++)
{
swap(q[i][k],q[j][k]);
}
for(int j=1;j<=n;j++)
{
if(j==i)
{
continue;
}
double t=q[j][i]/q[i][i];
for(int k=1;k<=n;k++)
{
q[j][k]-=q[i][k]*t;
}
b[j]-=t*b[i];
}
}
for(int i=1;i<=n;i++)
{
x[i]=q[i][n+1]/q[i][i];
}
}
void add(int x,int y)
{
ver[++tot]=y;
star[tot]=x;
nex[tot]=head[x];
head[x]=tot;
}
int main()
{
b[1]=1;
cin>>n>>m;
int s=m;
while(s--)
{
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
in[v]++;
in[u]++;
}
for(int i=1;i<n;i++)
{
q[i][i]=1.0;
for(int j=head[i];j;j=nex[j])
{
int k=ver[j];
if(j!=n)
{
q[j][k]=1.0/in[k];
}
}
}
gaosixiaoyuan();
for(int i=1;i<=m;i++)
{
h[i]=x[star[i]]/in[star[i]]+x[ver[i]]/in[ver[i]];
}
sort(b+1,b+n+1);
sort(h+1,h+m+1);
double ans=0;
for(int i=1;i<=m;i++)
{
ans+=(m-i+1)*h[i];
}
printf("%.3f\n",ans);
}
input:
3 3
2 3
1 2
1 3
output:
-1.#IO
求各位dalao将bug绳之以法(