您的位置:首页 > 理论基础 > 计算机网络

【BZOJ 1491】 [NOI2007]社交网络

2016-02-20 07:31 435 查看

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
map[i][j]表示i-->j的最短路,a[i][j]表示表示从i到j最短路的方案数,在改变最短路时该数组清零

#include<cstdio>
#include<cstring>
using namespace std;
const int N=110,inf=1000000000;
double a

;
int n,m,u,v;
double ans
,map

,w;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) map[i][j]=(inf+0.0);
for(int i=1;i<=m;i++){
scanf("%d%d%lf",&u,&v,&w);
map[u][v]=map[v][u]=(w+0.0);
a[u][v]=a[v][u]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if (map[i][j]>map[i][k]+map[k][j])map[i][j]=map[i][k]+map[k][j],a[i][j]=0;;
if (map[i][j]==(map[i][k]+map[k][j])) a[i][j]+=a[i][k]*a[k][j];
}
for(int i=1;i<=n;i++)a[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if (map[i][j]==(map[i][k]+map[k][j])&&a[i][j]>0)
ans[k]+=a[i][k]*a[k][j]/(a[i][j]+0.0);
}
for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: