码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1491: [NOI2007]社交网络

时间:2016-03-13 06:22:10      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

#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]社交网络

标签:

原文地址:http://www.cnblogs.com/xydddd/p/5271175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!