一:题目
在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同。
“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有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位。
输入样例:
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
结尾无空行
二:思路
思路:说这道题思路之前,先说一下做题的思路,任何题,我一拿到题,看到那个公式
就蒙了,但我有我自己的做题套路,那就是根据例子即输出输入样例,进行代数
规律也就浮出水面。
再说这道题,仔细看关键字的话,这是一个单源点求取最短路径问题 。这里没给边的
权值,这里是默认为 1 的 ,没有直接连接的为无穷;
图解:dij算法 和 prime算法
dij单源点最短路径
prime最小生成树
三:上码
/**
思路:说这道题思路之前,先说一下做题的思路,任何题,我一拿到题,看到那个公式
就蒙了,但我有我自己的做题套路,那就是根据例子即输出输入样例,进行代数
规律也就浮出水面。
再说这道题,仔细看关键字的话,这是一个单源点求取最短路径问题 。这里没给边的
权值,这里是默认为 1 的
*/
#include<bits/stdc++.h>
using namespace std;
#define infinite 9999
typedef struct GNode* PtrGraph;
typedef struct GNode{
int Nv;
int Ne;
int Date[10001][10001];
}gnode;
int flag = 0;
void createGraph(PtrGraph G){
int N,M;
cin >> N >> M;
G->Nv = N;
G->Ne = M;
//矩阵初始化
for( int i = 1; i <= G->Nv; i++ ){
for( int j = 0; j <= G->Nv; j++ ){
if( i == j )
G->Date[i][j] = 0;
else
G->Date[i][j] = infinite;
}
}
//矩阵赋值
for( int i = 1; i <= G->Ne; i++ ){
int a,b;
cin >> a >> b;
G->Date[a][b] = 1;
G->Date[b][a] = 1;
}
}
//dij算法
int dijGraph( PtrGraph G ,int x ){
int dist[10001];//存储 指定结点到其他结点的距离
int visited[10001] = {0};
int count = 0;//记录节点数
int sum = 0;
for( int i = 1; i <= G->Nv; i++){
dist[i] = G->Date[x][i];
}
visited[x] = 1;
count++;//已经统计了 x 结点
//找最小值 和 更新
while( 1 ){
int m = -1;
int min = infinite;
for( int i = 1; i <= G->Nv; i++ ){
if( visited[i] != 1 &&dist[i] < min ){
min = dist[i];
m = i;
}
}
if( m == -1 ){
break;
}
count++;
visited[m] = 1;
for( int i = 1; i <= G->Nv; i++ ){
if( visited[i] != 1 && min + G->Date[m][i] < dist[i] ){
dist[i] = min + G->Date[m][i];
}
}
}
if( count != G->Nv ){
flag = 1;
}
for( int i = 1; i <= G->Nv; i++ ){
sum += dist[i];
}
return sum;
}
int main(){
PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));
createGraph(G);
int K;
cin >> K;
for( int i = 0; i < K; i++ ){
int temp1,temp2;
cin >> temp1;
temp2 = dijGraph(G,temp1);
// cout << temp2 << endl;
if( flag == 0){
double temp3 = (double)(G->Nv - 1) / temp2;
printf("Cc(%d)=%0.2f\n",temp1,temp3);
}else{
printf("Cc(%d)=0.00\n",temp1);
}
}
}
//9 13
//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
//3 3 4 9
四:加油冲呀
·1:附带数据结构和算法导图一,别问,问就是嫖的,自己觉得蛮有用的,用来查漏补缺