[NOI2007][BZOJ1491] 社交网络

1491: [NOI2007]社交网络

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1086  Solved: 629
[Submit][Status][Discuss]

Description

Input

Output

输出文件包括n 行,每行一个实数,精确到小数点后3 位。第i 行的实数表 示结点i 在社交网络中的重要程度。

Sample Input

4 4
1 2 1
2 3 1
3 4 1
4 1 1

Sample Output

1.000
1.000
1.000
1.000

HINT


为1




开始是用的整形,强制转换实型结果被精度卡掉了……
n<=100,直接Floyd就好了,开一个数组记录两点间最短路条数(乘法原理)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
#define INF 10000007
using namespace std;
int n,m,a,b;
double c,v[101],dis[101][101],num[101][101];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
            dis[i][j]=INF;
            num[i][j]=0;
        }
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%lf",&a,&b,&c);
        dis[a][b]=c;
        dis[b][a]=c;
        num[a][b]=1;
        num[b][a]=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];
                    num[i][j]=0;
                }
                if (dis[i][j]==dis[i][k]+dis[k][j]) num[i][j]+=num[i][k]*num[k][j];
            }
    for (int i=1;i<=n;i++) num[i][i]=0;
    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                if (dis[i][k]+dis[k][j]==dis[i][j]&&num[i][j]!=0) v[k]+=num[i][k]*num[k][j]/num[i][j];
    for (int i=1;i<=n;i++) printf("%.3lf\n",v[i]);
    return 0;
}

 

posted @ 2015-07-15 10:05  ws_fqk  阅读(261)  评论(0编辑  收藏  举报