代码:
#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<double> to[20005], w[20005];
bool vst[20005];
double ans[105], cnt[105][105], d[105][105];
int main() {
freopen("socialnetwork.in", "r", stdin);
freopen("socialnetwork.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
double a, b, c;
cin >> a >> b >> c;
to[int(a)].push_back(b);
to[int(b)].push_back(a);
w[int(a)].push_back(c);
w[int(b)].push_back(c);
}
for (int i = 1; i <= m; i++)
for (int j = 0; j < w[i].size(); j++)
d[i][j] = w[i][j];
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
double cost = d[i][k] + d[k][j];
if (d[i][j] == cost)
cnt[i][j] += cnt[i][k] * cnt[k][j];
else if (d[i][j] > cost) {
d[i][j] = cost;
cnt[i][j] = cnt[i][k] * cnt[k][j];
}
}
for (int v = 1; v <= n; ++v)
for (int s = 1; s <= n; ++s)if (s != v)
for (int t = 1; t <= n; ++t)if (t != v && t != s)
if (d[s][t] == d[v][t] + d[s][v])
ans[v] += cnt[s][v] * cnt[v][t] / cnt[s][t];
for (int v = 1; v <= n; ++v)
cout << fixed << setprecision(3) << ans[v] << endl;
return 0;
}
输入:
5 10
5 3 5
2 5 4
1 5 3
3 4 3
4 1 5
2 3 4
2 4 5
2 1 1
1 3 2
5 4 2
输出:
0.000
-nan
-nan
-nan
-nan
正确输出:
3.667
0.000
0.667
0.667
0.667
本地和OJ都是这样
是NOI2007的题目