[bzoj1491] [NOI2007]社交网络

来源:互联网 发布:英语学霸软件 编辑:程序博客网 时间:2024/05/22 16:02

n<=100
先跑弗洛伊德,跑出最短路同时累计最短路的数量
枚举一个点k 再枚举i,j累计经过kij的最短路数量
累加一下就行了

注意范围和精度,要开ll

如果出现浮点数记得要开double

用float是不可能用的,这辈子都不可能用的

#include <cstdio>#include <ctype.h>#include <cstring>#define lb double#define ll long long#define max(a,b) a>b?a:b#define min(a,b) a<b?a:btemplate<typename T>inline T read(T &f){    f=0;    int x=1;    char c=getchar();    while(!isdigit(c)){if(c=='-')x=-1;c=getchar();}    while(isdigit(c))f=f*10+c-'0',c=getchar();    return f*x;}const int maxn=105;const ll INF=1e10+5;int n,m;int u,v,w;ll G[maxn][maxn];ll num[maxn][maxn];lb ans[maxn];int main(){    read(n);    read(m);    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            G[i][j]=INF;    for(int i=1;i<=m;i++){        read(u);        read(v);        read(w);        G[u][v]=G[v][u]=w;        num[u][v]=num[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(G[i][k]+G[k][j]<G[i][j])                    G[i][j]=G[i][k]+G[k][j],num[i][j]=0;                if(G[i][k]+G[k][j]==G[i][j])                    num[i][j]+=num[i][k]*num[k][j];            }    for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                if(k!=j&&k!=i&&j!=i)                    if(G[i][k]+G[k][j]==G[i][j])                        ans[k]+=(num[i][k]*num[k][j]*1.0)/(num[i][j]*1.0);    for(int i=1;i<=n;i++)        printf("%.3lf\n",ans[i]);    return 0;}
原创粉丝点击