题目链接
在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同。
“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有N个结点的网络中,结点vi的“紧密度中心性”Cc(vi)数学上定义为vi到其余所有结点vj (j≠i) 的最短距离d(vi,vj)的平均值的倒数:
对于非连通图,所有结点的紧密度中心性都是0。
给定一个无权的无向图以及其中的一组结点,计算这组结点中每个结点的紧密度中心性。
输入格式:
输入第一行给出两个正整数N和M,其中N(≤104)是图中结点个数,顺便假设结点从1到N编号;M(≤105)是边的条数。随后的M行中,每行给出一条边的信息,即该边连接的两个结点编号,中间用空格分隔。最后一行给出需要计算紧密度中心性的这组结点的个数K(≤100)以及K个结点编号,用空格分隔。
输出格式:
按照Cc(i)=x.xx的格式输出K个给定结点的紧密度中心性,每个输出占一行,结果保留到小数点后2位。
输入样例:
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
输出样例:
Cc(3)=0.47
Cc(4)=0.62
Cc(9)=0.35
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
vector <int> vec[10001];
bool visited[10001];
int sum,cnt;
typedef struct Node{
int x;
int step;//统计到每一个点的距离
}Node;
void bfs(int d,int v){
queue <Node> Q;//定义一个结构体队列
Node p;
p.x = d;
p.step = 0;
Q.push(p);
visited[d] = true;
cnt++;//统计结点数
while(!Q.empty()){
Node fnt = Q.front();
Q.pop();
for(int i = 0;i < vec[fnt.x].size();i++)
if(!visited[vec[fnt.x][i]]){
visited[vec[fnt.x][i]] = true;
p.x = vec[fnt.x][i];
p.step = fnt.step + 1;//当前结点的距离等于与之相连接的点的距离+1
Q.push(p);
cnt++;
sum += p.step;//统计总距离
}
}
return;
}
int main(){
int n,m,a,b,k,d;
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i++){
scanf("%d%d",&a,&b);
vec[a].push_back(b);
vec[b].push_back(a);
}
scanf("%d",&k);
for(int i = 0;i < k;i++){
memset(visited,false,sizeof(visited));//必须重新进行赋值
sum = 0,cnt = 0;//sum统计到所有结点的距离之和,cnt统计结点个数,必须每次都清零
scanf("%d",&d);
bfs(d,n);
if(cnt >= n){
//第二次做,看清题意,是距离和的倒数!倒数!倒数!这粗心的毛病什么时候能改...
//int/int 想要转化成double类型,只须把分子转化成double类型,只转化分母不可以!!!
printf("Cc(%d)=%.2lf\n", d,(n - 1) * 1.0/sum);
continue;
}
printf("Cc(%d)=0.00\n",d);
}
return 0;
}