Code:
#include <cmath> #include <cstdio> #include <algorithm> #define N 503 #define M 205089 #define setIO(s) freopen(s".in","r",stdin) using namespace std; double f[N][N],G[M]; int edges; int hd[N],to[M<<1],nex[M<<1],deg[N],U[M],V[M]; void add(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; } void Gauss(int n) { int i,j,k,now; for(i=1;i<=n;++i) { now=i; for(j=i;j<=n;++j) { if(fabs(f[j][i])>fabs(f[now][i])) now=j; } if(now!=i) { for(j=1;j<=n;++j) swap(f[i][j],f[now][j]); } if(f[i][i]) { for(j=i+1;j<=n+1;++j) f[i][j]/=f[i][i]; f[i][i]=1; } for(j=i+1;j<=n;++j) { double div=f[j][i]; for(k=i+1;k<=n+1;++k) f[j][k]-=div*f[i][k]; f[j][i]=0; } } for(i=n;i>=1;--i) { for(j=i+1;j<=n;++j) { f[i][n+1]-=f[j][n+1]*f[i][j]; } } } int main() { int i,j,n,m; // setIO("input"); scanf("%d%d",&n,&m); for(i=1;i<=m;++i) { int u,v; scanf("%d%d",&u,&v),add(u,v),add(v,u),++deg[u],++deg[v],U[i]=u,V[i]=v; } f[1][n]=1.0; for(i=1;i<n;++i) { f[i][i]=1; for(j=hd[i];j;j=nex[j]) { int v=to[j]; if(v==n) continue; f[i][v]=-1.0/deg[v]; } } Gauss(n-1); for(i=1;i<=m;++i) { int a=U[i],b=V[i]; if(a!=n) { G[i]+=f[a][n]*(1.0/deg[a]); } if(b!=n) { G[i]+=f[b][n]*(1.0/deg[b]); } } sort(G+1,G+1+m); double ans=0; for(i=1;i<=m;++i) { ans+=G[i]*((m-i+1)*1.0); } printf("%.3lf\n",ans); return 0; }