BZOJ 1491: [NOI2007]社交网络 floyed

title

BZOJ 1491

LUOGU 2047

简化题意:

设重要程度的定义如下:令 \(C_{s,t}\) 表示从 \(s\)\(t\) 的不同的最短路的数目,\(C_{s,t}(v)\) 表示经过 \(v\)\(s\)\(t\) 的最短路的数目,则定义:
\[ I(v)=\sum_{s \ne v,t\ne v} \frac{C_{s,t}(v)}{C_{s,t}} \]

为结点 \(v\) 在社交网络中的重要程度。

给定一张无向图, \(n\)个点,\(m\) 条边,求出每个点在社交网络中的重要程度。

analysis

和重要的城市差不多。

\(n\leqslant 100\) 明显 \(floyed\) 解决,在其过程中根据乘法原理统计一下经过这个点的最短路的数目。

最后统计即可。

code

#include<bits/stdc++.h>

typedef long long ll;
const int maxn=101;

namespace IO
{
    char buf[1<<15],*fs,*ft;
    inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
    template<typename T>inline void read(T &x)
    {
        x=0;
        T f=1, ch=getchar();
        while (!isdigit(ch) && ch^'-') ch=getchar();
        if (ch=='-') f=-1, ch=getchar();
        while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
        x*=f;
    }
}

using IO::read;

template<typename T>inline bool chkMin(T &a,const T &b) { return a>b ? (a=b, true) : false; }
template<typename T>inline bool chkMax(T &a,const T &b) { return a<b ? (a=b, true) : false; }

ll d[maxn][maxn],s[maxn][maxn];
double ans[maxn];
int main()
{
    int n,m;read(n);read(m);
    memset(d,0x7f,sizeof(d));ll inf=d[1][1];
    for (ll i=1,x,y,z; i<=m; ++i) read(x),read(y),read(z),d[x][y]=d[y][x]=z,s[x][y]=s[y][x]=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]==inf && d[k][j]==inf) continue;
                if (chkMin(d[i][j],d[i][k]+d[k][j])) s[i][j]=s[i][k]*s[k][j];
                else if (d[i][j]==d[i][k]+d[k][j]) s[i][j]+=s[i][k]*s[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 || k==j) continue;
                if (d[i][j]==d[i][k]+d[k][j]) ans[k]+=(1.0*s[i][k]*s[k][j])/s[i][j];
            }
    for (int i=1; i<=n; ++i) printf("%.3lf\n",ans[i]);
    return 0;
}

转载于:https://www.cnblogs.com/G-hsm/p/11417693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值