[BZOJ1491][NOI2007]社交网络

来源:互联网 发布:粉笔申论智能批改 知乎 编辑:程序博客网 时间:2024/05/22 11:54

原题地址

Floyd变种,用Floyd算法求最短路条数.
我用的居然是三维数组...

#include <cstdio>typedef long long ll;const ll N=101;const ll INF=1<<28;ll n,m;ll f[N][N][N],g[N][N][N];ll Min(ll x,ll y){    return x<y?x:y;}int main(){    scanf("%lld%lld",&n,&m);    for(ll i=1;i<=n;i++){        for(ll j=1;j<=n;j++) f[i][j][0]=INF;    }    for(ll i=1;i<=m;i++){        ll u,v,c;        scanf("%lld%lld%lld",&u,&v,&c);        f[u][v][0]=f[v][u][0]=c;        g[u][v][0]=g[v][u][0]=1;    }    for(ll k=1;k<=n;k++){        for(ll i=1;i<=n;i++){            for(ll j=1;j<=n;j++)                if(i==j) f[i][j][k]=INF;                else f[i][j][k]=Min(f[i][j][k-1],f[i][k][k-1]+f[k][j][k-1]);        }    }    for(ll k=1;k<=n;k++){        for(ll i=1;i<=n;i++){            for(ll j=1;j<=n;j++){                if(i==j) continue;                if(f[i][j][k-1]<f[i][k][k-1]+f[k][j][k-1])                    g[i][j][k]=g[i][j][k-1];                else if(f[i][k][k-1]+f[k][j][k-1]<f[i][j][k-1])                    g[i][j][k]=g[i][k][k-1]*g[k][j][k-1];                else g[i][j][k]=g[i][j][k-1]+g[i][k][k-1]*g[k][j][k-1];            }        }    }    for(ll i=1;i<=n;i++){        double imp=0;        for(ll s=1;s<=n;s++){            for(ll t=1;t<=n;t++)                if(i!=s&&i!=t&&s!=t&&f[s][i][n]+f[i][t][n]==f[s][t][n]&&g[s][t][n])                    imp+=(double)(g[s][i][n]*g[i][t][n])/g[s][t][n];        }        printf("%.3lf\n",imp);    }    return 0;  }
0 0
原创粉丝点击