Floyd的应用。
【代码】
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#define N 105
#define INF 1000000000
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pa;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m;
int dis[N][N];
double w[N][N],ans[N];
void Input_Init()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) dis[i][j]=INF;
for(int i=1;i<=m;i++)
{
static int x,y,z;
x=read(),y=read(),z=read();
if(dis[x][y]>z) dis[x][y]=dis[y][x]=z;
w[x][y]=w[y][x]=1;
}
}
void Floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j||i==k||j==k) continue;
if(dis[i][j]>dis[i][k]+dis[k][j])
{
w[i][j]=w[i][k]*w[j][k];
dis[i][j]=dis[i][k]+dis[k][j];
}
else if(dis[i][j]==dis[i][k]+dis[k][j])
w[i][j]+=w[i][k]*w[j][k];
}
}
void Get_Ans()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==k||j==k||i==j) continue;
if(dis[i][j]==dis[i][k]+dis[k][j]) ans[k]+=(w[i][k]*w[k][j])/w[i][j];
}
for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);
}
int main()
{
Input_Init();
Floyd();
Get_Ans();
return 0;
}