一道能让你完全理解floyd算法的题目
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int d[101][101];
long long num[101][101];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (j == i)
continue;
d[i][j] = 1000000000;
}
while (m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
d[a][b] = c;
d[b][a] = c;
num[b][a] = 1;
num[a][b] = 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
{
if (d[j][i] + d[i][k] < d[j][k])
{
d[j][k] = d[j][i] + d[i][k];
num[j][k] = num[j][i] * num[i][k];
}
else
{
if (d[j][i] + d[i][k] == d[j][k])
{
num[j][k] += (num[j][i] * num[i][k]);
}
}
}
}
for (int i = 1; i <= n; i++)
{
long long ans = 0;
double ans1 = 0;
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
{
if (i == j || j == k || i == k)
continue;
if (d[j][i] + d[i][k] == d[j][k])
{
ans1 += ((num[j][i] * num[i][k] * 1.0) / (num[j][k] * 1.0));
}
}
printf("%.3lf\n", ans1);
}
return 0;
}