NOI2007 社交网络

题目链接:戳我

就是在floyd计算dis的时候,顺便把两点之间最短路的个数也计算了qwqwq

\(sum[i][j]=\sum sum[i][k]*sum[k][j]\)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 310
using namespace std;
int n,m;
long long dis[MAXN][MAXN],sum[MAXN][MAXN];
double ans[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d%d",&n,&m);
    memset(dis,0x3f,sizeof(dis));
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        dis[u][v]=dis[v][u]=w;
        sum[u][v]=sum[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(dis[i][j]>dis[i][k]+dis[k][j])
                    dis[i][j]=dis[i][k]+dis[k][j],sum[i][j]=sum[i][k]*sum[k][j];
                else if(dis[i][j]==dis[i][k]+dis[k][j])
                    sum[i][j]+=sum[i][k]*sum[k][j];
            }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if((i==j)||(i==k)||(j==k)) continue;
                if(dis[i][k]+dis[k][j]==dis[i][j])  
                    ans[k]+=1.0*sum[i][k]*sum[k][j]/sum[i][j];
            }
    for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);
    return 0;
}

BZOJ100题纪念!

posted @ 2019-03-04 13:47  风浔凌  阅读(218)  评论(0编辑  收藏  举报