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

来源:互联网 发布:专业服装收银软件 编辑:程序博客网 时间:2024/06/05 16:29

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 141 21 31 42 33 44 54 65 65 75 86 76 87 87 93 3 4 9

样例输出1

Cc(3)=0.47Cc(4)=0.62Cc(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[b][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;}

2017年12月06日

阅读全文
0 0