bzoj1491: [NOI2007]社交网络 FLOYD

来源:互联网 发布:审计软件缺点 编辑:程序博客网 时间:2024/06/05 09:35

经典的floyd ,w[I][J]表示从i到j有几条路,这里为了方便答案计算就设为double了。

floyd的时候进行判断,如果有更新的话w[i][j]=w[i][k]*w[k][j];如果是另一条最短路的话w[i][j]+=w[i][k]*w[k][j]。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define maxn 110#define maxm 10010using namespace std;int n,m;int dis[maxn][maxn];double w[maxn][maxn],ans[maxn];int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            dis[i][j]=1000000;        }    }    int x,y,z;    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&x,&y,&z);        dis[x][y]=dis[y][x]=z;        w[x][y]=w[y][x]=1;    }    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            if(k==i) continue;            for(int j=1;j<=n;j++)            {                if(k==j||i==j) continue;                if(dis[i][k]+dis[k][j]<dis[i][j])                {                    dis[i][j]=dis[i][k]+dis[k][j];                    w[i][j]=w[i][k]*w[k][j];                }                else if(dis[i][k]+dis[k][j]==dis[i][j])                {                    w[i][j]+=w[i][k]*w[k][j];                }            }        }    }    for (int k=1;k<=n;k++)    {        for (int i=1;i<=n;i++) if (i!=k)            for (int j=1;j<=n;j++) if (j!=i&&j!=k)                if (dis[i][k]+dis[k][j]==dis[i][j]) ans[k]+=(w[i][k]*w[k][j])/w[i][j];        printf("%.3f\n",ans[k]);    }    return 0;}

0 0
原创粉丝点击