题目描述
输入格式
输出格式
样例输入
4 4
1 2 1
2 3 1
3 4 1
4 1 1
样例输出
1.000
1.000
1.000
1.000
分析
没什么好说的,floyd暴力就行了,再注意一下范围.
代码
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#define inf 0x7fffffff/2
using namespace std;
long long n,m,d[105][105],g[105][105];
long double ans[105];
int main() {
scanf("%lld%lld",&n,&m);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
d[i][j]=(i==j?0:inf);
for (int i = 1;i <= m;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
d[a][b]=d[b][a]=c;
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (d[i][j]!=inf&&d[i][j]!=0) g[i][j]=1;
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++) {
if (d[i][j]==d[i][k]+d[k][j]) g[i][j]+=g[i][k]*g[k][j];
if (d[i][j]>d[i][k]+d[k][j]) {
d[i][j]=d[i][k]+d[k][j];
g[i][j]=g[i][k]*g[k][j];
}
}
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++) {
if (i==k) continue;
for (int j = 1;j <= n;j++) {
if (j==k) continue;
if (d[i][k]+d[k][j]==d[i][j]) {
ans[k]+=((long double)(g[i][k])*g[k][j])/g[i][j];
}
}
}
for (int i = 1;i <= n;i++)
printf("%.3Lf\n",ans[i]);
return 0;
}