#include<cstdio> #include<iostream> #include<cstring> #define M 105 using namespace std; int n,m; long long d[M][M],sum[M][M]; double ans[M]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=10000000001; for(int i=1;i<=m;i++) { int a1,a2; scanf("%d%d",&a1,&a2); scanf("%lld",&d[a1][a2]); d[a2][a1]=d[a1][a2]; sum[a1][a2]=sum[a2][a1]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(d[i][k]+d[k][j]<d[i][j]) { d[i][j]=d[i][k]+d[k][j]; sum[i][j]=0; } if(d[i][k]+d[k][j]==d[i][j]) sum[i][j]+=sum[i][k]*sum[k][j]; } for(int i=1;i<=n;i++)sum[i][i]=0; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][j]==d[i][k]+d[k][j]&&sum[i][j]) ans[k]+=(sum[i][k]*sum[k][j])/(double)sum[i][j]; for(int i=1;i<=n;i++) printf("%.3f\n",ans[i]); return 0; }
弗洛伊德求出两点之间的的最短距离以及有多少种方案,在用弗洛伊德判断每个点在那些最短路上。