本地调试的时候显示输出那里爆了。
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=3e5;
const double eps=1e-12;
struct edge{int x,y,pre;}e[M];
int last[N],elen;
void ins(int x,int y){
e[++elen]=edge{x,y,last[x]};
last[x]=elen;
}
int n,m,d[N];
double a[N][N],f[N],id[N];
void gauss(){
int now=1,k;
for(int i=1;i<=n;i++){
for(k=now;k<=n;k++){
if(fabs(a[k][i])>eps){
swap(a[k],a[now]);
break;
}
}
if(k==n+1)continue;
for(k=1;k<=n;k++){
if(k!=now){
double tmp=a[k][i]/a[now][i];
for(int j=1;j<=n+1;j++){
a[k][j]-=tmp*a[now][j];
}
}
}
now++;
}
for(int i=1;i<=n;i++){
f[i]=a[i][n+1]/a[i][i];
}
}
int main(){
scanf("%d%d",&n,&m);
elen=1;memset(last,0,sizeof(last));
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
d[x]++,d[y]++;
}
n--;a[1][n+1]=-1.0;
for(int x=1;x<=n;x++){
a[x][x]=-1.0;
for(int k=last[x];k;k=e[k].pre){
int y=e[k].y;
if(y!=n+1){
a[x][y]=1.0/d[y];
}
}
}
gauss();
for(int k=2;k<=elen;k+=2){
int x=e[k].x,y=e[k].y;
id[k/2]=f[x]*1.0/d[x]+f[y]*1.0/d[y];
}
sort(id+1,id+m+1);
double ans=0;
for(int i=1;i<=m;i++){
ans=ans+id[i]*1.0*(m-i+1);
}
printf("%.3lf",ans);
return 0;
}