zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
        return 0;
    }

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

  • 相关阅读:
    01:求平均年龄
    09:与圆相关的计算
    08:温度表达转化
    07:计算多项式的值
    06:甲流疫情死亡率
    05:计算分数的浮点数值
    04:带余除法
    03:计算(a+b)/c的值
    02:计算(a+b)*c的值
    01:A+B问题
  • 原文地址:https://www.cnblogs.com/xydddd/p/5271175.html
Copyright © 2011-2022 走看看