[NOI2007]社交网络

Description

在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象。不妨看这样的一个问题。

在一个社交圈子里有n个人,人与人之间有不同程度的关系。我们将这个关系网络对应到一个n个结点的无向图上,两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表示两个人之间的关系越密切。我们可以用对应结点之间的最短路长度来衡量两个人s和t之间的关系密切程度,注意到最短路径上的其他结点为s和t的联系提供了某种便利,即这些结点对于s和t之间的联系有一定的重要程度。我们可以通过统计经过一个结点v的最短路径的数目来衡量该结点在社交网络中的重要程度。考虑到两个结点A和B之间可能会有多条最短路径。我们修改重要程度的定义如下:令Cs,t表示从s到t的不同的最短路的数目,Cs,t(v)表示经过v从s到t的最短路的数目;则定义

为结点v在社交网络中的重要程度。为了使I(v)和Cs,t(v)有意义,我们规定需要处理的社交网络都是连通的无向图,即任意两个结点之间都有一条有限长度的最短路径。现在给出这样一幅描述社交网络的加权无向图,请你求出每一个结点的重要程度。

Input

输入第一行有两个整数n和m,表示社交网络中结点和无向边的数目。在无向图中,我们将所有结点从1到n进行编号。接下来m行,每行用三个整数a,b,c描述一条连接结点a和b,权值为c的无向边。注意任意两个结点之间最多有一条无向边相连,无向图中也不会出现自环(即不存在一条无向边的两个端点是相同的结点)。n≤100;m≤4500,任意一条边的权值 c 是正整数,满足:1≤c≤1000。所有数据中保证给出的无向图连通,且任意两个结点之间的最短路径数目不超过 10^10

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 号结点而言,只有 2 号到 4 号结点和 4 号到 2 号结点的最短路经过 1 号结点,而 2 号结点和 4 号结点之间的最短路又有 2 条。因而根据定义,1 号结点的重要程度计算为 1/2 + 1/2 = 1 。由于图的对称性,其他三个结点的重要程度也都是 1 。

最短路+任意两点间最短路及其条数

这道题用\(Floyed\)比较方便,先处理出任意两个点之间的最短距离,同时记录两点间最短距离的条数。

\(a[i][j]\)表示从\(i\)走到\(j\)的最短路

\(sum[i][j]\)表示从\(i\)到\(j\)的最短路条数

if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j],sum[i][j]=sum[i][k]*sum[k][j];
else if(a[i][j]==a[i][k]+a[k][j])
sum[i][j]+=sum[i][k]*sum[k][j];

然后直接枚举\(s,t\),更新其他的点的答案。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define lll long long
using namespace std;
lll read()
{
lll x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
const int N=110;
int n,m,qwe,x,y,z;
lll a[N][N],sum[N][N];
double ans[N];
int main()
{
n=read();m=read();memset(a,0x3f,sizeof(a));
for(int i=1;i<=m;i++)
{
x=read();y=read();z=read();
a[x][y]=a[y][x]=z;sum[x][y]=sum[y][x]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
{
if(i==k) continue;
for(int j=1;j<=n;j++)
{
if(j==i||j==k) continue;
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j],sum[i][j]=sum[i][k]*sum[k][j];
else if(a[i][j]==a[i][k]+a[k][j]) sum[i][j]+=sum[i][k]*sum[k][j];
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) continue;
for(int k=1;k<=n;k++)
{
if(k==i||k==j) continue;
if(a[i][k]+a[k][j]==a[i][j])
{
ans[k]+=sum[i][k]*sum[k][j]*1.000/sum[i][j];
}
}
}
for(int i=1;i<=n;i++) printf("%.3lf\n",ans[i]);
}

最新文章

  1. BZOJ2144: 跳跳棋
  2. 使用 Python 进行稳定可靠的文件操作
  3. Android系统兼容性问题(持续更新)
  4. Active Session History (ASH) Performed An Emergency Flush Messages In The Alert Log
  5. Android UI效果实现——滑动模糊渐变效果实现
  6. hdu 5495 LCS 水题
  7. linux http请求监控工具httpry---官方文档
  8. linux之SQL语句简明教程---BETWEEN
  9. [置顶] Guava学习之Iterators
  10. Storm 提交多个流例程
  11. Neutron:访问外网
  12. PCA算法数学原理及实现
  13. MySQL 表字段操作
  14. Grafana报警--通知渠道配置
  15. MS SQL批量生成作业脚本方法介绍总结
  16. c# winform导出Excel
  17. liunx 常用命令学习笔记
  18. Codeforces 545E. Paths and Trees 最短路
  19. OpenCV——反向投影(定位模板图像在输入图像中的位置)
  20. c# Login UI with background picture animation

热门文章

  1. CentOS yum 安装历史版本 java
  2. EF6中一个关于时间类型 datetime2 的坑
  3. 004-spring-data-elasticsearch 3.0.0.0使用【二】-spring-data之定义方法、创建repository实例、从聚合根发布事件
  4. spring的后置处理器——BeanPostProcessor以及spring的生命周期
  5. Openstack_通用技术_RPC 远程异步调用
  6. set_index()与reset_index()函数
  7. win10+jdk+mysql+tomcat+jpress环境搭建与部署
  8. SSM Maven MallDemo项目为例
  9. Nginx基本属性配置
  10. 第一章:Java语言概述与环境开发