您的位置:首页 > 理论基础 > 计算机网络

PAT OJ.社交网络图中结点的“重要性”计算

2017-12-06 17:24 274 查看

PAT. 社交网络图中结点的“重要性”计算

描述

在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以
理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其
在网络中体现的重要性也不尽相同。
“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的
结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有N个结
点的网络中,结点v​i​​ 的“紧密度中心性”Cc(v​i​​ )数学上定义为v​i​​ 到其余所有结点v​j​​  (j≠i) 的最短距离d(v​
i​​ ,v​j​​ )的平均值的倒数:
对于非连通图,所有结点的紧密度中心性都是0。
给定一个无权的无向图以及其中的一组结点,计算这组结点中每个结点的紧密度中心性。


输入

输入第一行给出两个正整数N和M,其中N≤10^​4​​ 是图中结点个数,顺便假设结点从1到N编号;M≤10^​5是边的条
数。随后的M行中,每行给出一条边的信息,即该边连接的两个结点编号,中间用空格分隔。最后一行给出需要计
算紧密度中心性的这组结点的个数K(≤100)以及K个结点编号,用空格分隔。


输出

按照Cc(i)=x.xx的格式输出K个给定结点的紧密度中心性,每个输出占一行,结果保留到小数点后2位。


样例输入1

9 14
1 2
1 3
1 4
2 3
3 4
4 5
4 6
5 6
5 7
5 8
6 7
6 8
7 8
7 9
3 3 4 9


样例输出1

Cc(3)=0.47
Cc(4)=0.62
Cc(9)=0.35


问题分析:

只需要求每个点到达其他点的最短距离,利用Floyd-Warshall算法,轻松解决。不过时间花费比N遍的Dijkstra算法要更高。

///代码实现,c++版本
#include <bits/stdc++.h>

using namespace std;

int main()
{
int N,M,K,b,c;
cin>>N>>M;
int **a=new int*[N+1];//申请空间来存储数据
for(int i=0;i<N+1;i++)
a[i]=new int[(N+1)];
for(int i=1;i<=N;i++){//数据初始化处理
for(int j=1;j<=N;j++)
{
a[i][j]=9999999;
}
}
while(M--)
{
cin>>b>>c;
a[c]=a[c][b]=1;
}

for(int k=1;k<=N;k++)//Floyd-Warshall算法
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
if(i==j)continue;
if(a[i][j]>(a[i][k]+a[k][j]))
a[i][j]=a[i][k]+a[k][j];
}
cin>>K;
while(K--)
{
int tmp=0;
cin>>b;
for(int i=1;i<=N;i++)
{
if(i!=b)tmp=tmp+a[b][i];
}
printf("Cc(%d)=%.02f\n",b,(N-1)*1.0/tmp);
}
return 0;
}


[b]2017年12月06日


4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OJ