Description
===========
Input
=====
**
Output
**
输出文件包括n 行,每行一个实数,精确到小数点后3 位。第i 行的实数表 示结点i 在社交网络中的重要程度。
**
Sample Input
**
4 4
1 2 1
2 3 1
3 4 1
4 1 1
Sample Output
1.000
1.000
1.000
1.000
HINT
为1
题解
Floyd a[i][j]记录ij之间路径数
HZW
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
const int maxn=101;
double mp[maxn][maxn];
double a[maxn][maxn];
double ans[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=1e15;
int x,y;double z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%lf",&x,&y,&z);
mp[x][y]=mp[y][x]=z;
a[x][y]=a[y][x]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
if(k!=i)
for(int j=1;j<=n;j++)
if(i!=j&&k!=j)
{
if(mp[i][k]+mp[k][j]<mp[i][j]){mp[i][j]=mp[i][k]+mp[k][j];a[i][j]=0;}
if(mp[i][j]==mp[i][k]+mp[k][j])a[i][j]+=a[i][k]*a[k][j];
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(mp[i][k]+mp[k][j]==mp[i][j])
ans[k]+=a[i][k]*a[k][j]/a[i][j];
}
for(int i=1;i<=n;i++)printf("%.3lf\n",ans[i]);
return 0;
}
——既然选择了远方,便只顾风雨兼程
有错误欢迎各神犇指正~THX