#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;
}

弗洛伊德求出两点之间的的最短距离以及有多少种方案,在用弗洛伊德判断每个点在那些最短路上。

posted on 2016-03-13 05:57  xiyuedong  阅读(131)  评论(0编辑  收藏  举报