bzoj 1491: [NOI2007]社交网络

Posted xiyuedong

tags:

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

#include<cstdio>
#include<iostream>
#include<cstring>
#define M 105
using namespace std;
int n,m;
long long d[M][M],sum[M][M];
double ans[M];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        d[i][j]=10000000001;
    for(int i=1;i<=m;i++)
      {
        int a1,a2;
        scanf("%d%d",&a1,&a2);
        scanf("%lld",&d[a1][a2]);
        d[a2][a1]=d[a1][a2];
        sum[a1][a2]=sum[a2][a1]=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][k]+d[k][j]<d[i][j])
              {
                d[i][j]=d[i][k]+d[k][j];
                sum[i][j]=0;
              }
            if(d[i][k]+d[k][j]==d[i][j])
              sum[i][j]+=sum[i][k]*sum[k][j];
          }
    for(int i=1;i<=n;i++)sum[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(d[i][j]==d[i][k]+d[k][j]&&sum[i][j])
            ans[k]+=(sum[i][k]*sum[k][j])/(double)sum[i][j];
    for(int i=1;i<=n;i++)
      printf("%.3f\n",ans[i]);
    return 0;
}

弗洛伊德求出两点之间的的最短距离以及有多少种方案,在用弗洛伊德判断每个点在那些最短路上。

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

[BZOJ1491][NOI2007]社交网络 floyd

bzoj 1491: [NOI2007]社交网络

BZOJ 1491 [NOI2007]社交网络

BZOJ1491[NOI2007]社交网络 Floyd

BZOJ1491: [NOI2007]社交网络

bzoj1491: [NOI2007]社交网络