#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint maxn = 1e2 + 50; int n, m; ll d[maxn][maxn], c[maxn][maxn]; double ans[maxn];
intmain(){ cin >> n >> m; memset(d, 0x3f, sizeof(d)); for (int u, v, w, i = 1; i <= m; ++i) { cin >> u >> v >> w; c[u][v] = c[v][u] = 1, d[u][v] = d[v][u] = w; } 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) { if (d[i][j] > d[i][k] + d[k][j]) { c[i][j] = c[i][k] * c[k][j]; d[i][j] = d[i][k] + d[k][j]; } elseif (d[i][j] == d[i][k] + d[k][j]) { c[i][j] += c[i][k] * c[k][j]; } } 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 && d[i][j] == d[i][k] + d[k][j]) ans[k] += (double)c[i][k] * c[k][j] / c[i][j]; for (int i = 1; i <= n; ++i) printf("%.3lf\n", ans[i]); return0; }
思路
注意审题,本题中i, j, k即两端点和中间点都不能相同!
所以没有d[i][i] = 0, c[i][i] = 1的常规初始化,且所有的最短路更新和次数记录也必须都在i != j && i != k && j != k的条件下进行!