码迷,mamicode.com
首页 > 其他好文 > 详细

[NOI2007][BZOJ1491] 社交网络

时间:2015-07-15 10:47:29      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

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;
}

 

[NOI2007][BZOJ1491] 社交网络

标签:

原文地址:http://www.cnblogs.com/ws-fqk/p/4647513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!