BZOJ 1491 [NOI2007]社交网络

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1491 [NOI2007]社交网络相关的知识,希望对你有一定的参考价值。

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最短路的方案数,在改变最短路时该数组清零
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=110,inf=1000000000;
 5 double a[N][N];
 6 int n,m,u,v;
 7 double ans[N],map[N][N],w;
 8 int main(){
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++)
11         for(int j=1;j<=n;j++) map[i][j]=(inf+0.0);
12     for(int i=1;i<=m;i++){
13         scanf("%d%d%lf",&u,&v,&w);
14         map[u][v]=map[v][u]=(w+0.0);
15         a[u][v]=a[v][u]=1;
16     }
17     for(int k=1;k<=n;k++)
18         for(int i=1;i<=n;i++)
19             for(int j=1;j<=n;j++){
20                 if (map[i][j]>map[i][k]+map[k][j])map[i][j]=map[i][k]+map[k][j],a[i][j]=0;;
21                 if (map[i][j]==(map[i][k]+map[k][j])) a[i][j]+=a[i][k]*a[k][j]; 
22             }
23      for(int i=1;i<=n;i++)a[i][i]=0;
24     for(int k=1;k<=n;k++)
25         for(int i=1;i<=n;i++)
26             for(int j=1;j<=n;j++){
27                 if (map[i][j]==(map[i][k]+map[k][j])&&a[i][j]>0)
28                 ans[k]+=a[i][k]*a[k][j]/(a[i][j]+0.0); 
29             }
30     for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);      
31 }

 

以上是关于BZOJ 1491 [NOI2007]社交网络的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1491][NOI2007]社交网络 floyd

bzoj 1491: [NOI2007]社交网络

BZOJ 1491 [NOI2007]社交网络

BZOJ1491[NOI2007]社交网络 Floyd

BZOJ1491: [NOI2007]社交网络

bzoj1491: [NOI2007]社交网络