在进行floyd时,按照dp思想考虑第一次遍历相等时继承当前最短路条数,再次遍历到时考虑相加路径。按照定义计算重要程度即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=110,M=4510;
int n,m;
int d[N][N];
int cnt[N][N];
signed main()
{
memset(d, 0x3f, sizeof d);
for(int i=1;i<=n;i++)
d[i][i]=0;
cin>>n>>m;
while (m -- )
{
int a,b,c;
cin>>a>>b>>c;
d[a][b]=d[b][a]=c;
cnt[a][b] = cnt[b][a] = 1;//表示两点之间存在一条边
}
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)//前提是不相等
{
if(d[i][j] > d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
cnt[i][j] = cnt[i][k] * cnt[k][j];//乘法原理
}
else if(d[i][j] == d[i][k] + d[k][j])
cnt[i][j] += cnt[i][k] * cnt[k][j];
}
}
//cout<<cnt[1][3]<<endl;
//按照重要程度定义计算
for(int k=1;k<=n;k++)
{
double res=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(cnt[i][j]&&d[i][k]+d[k][j]==d[i][j]&&i!=k&&j!=k&&i!=j)
res+=1.0*cnt[i][k]*cnt[k][j]/cnt[i][j];
}
}
printf("%.3lf\n", res);
}
}