在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同。
“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有N个结点的网络中,结点vi的“紧密度中心性”
C
c
(
v
i
Cc(vi
Cc(vi)数学上定义为vi到其余所有结点
v
j
(
j
≠
i
)
vj (j≠i)
vj(j=i) 的最短距离
d
(
v
i
,
v
j
)
d(vi,vj)
d(vi,vj)的平均值的倒数:
对于非连通图,所有结点的紧密度中心性都是
0
0
0。
给定一个无权的无向图以及其中的一组结点,计算这组结点中每个结点的紧密度中心性。
输入格式:
输入第一行给出两个正整数
N
N
N和
M
M
M,其中
N
(
≤
1
0
4
)
N(≤10^4)
N(≤104)是图中结点个数,顺便假设结点从
1
1
1到
N
N
N编号;
M
(
1
0
5
)
M(10^5)
M(105)是边的条数。随后的
M
M
M行中,每行给出一条边的信息,即该边连接的两个结点编号,中间用空格分隔。最后一行给出需要计算紧密度中心性的这组结点的个数
K
(
≤
100
)
K(≤100)
K(≤100)以及K个结点编号,用空格分隔。
输出格式:
按照
C
c
(
i
)
=
x
.
x
x
Cc(i)=x.xx
Cc(i)=x.xx的格式输出
K
K
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
一道板子题,迪杰斯特拉堆优化
O
(
n
l
o
g
m
)
O(nlogm)
O(nlogm)模板如下
struct Edge {
int to, w;
} ;
vector<Edge> G[MAXN];
#define cls(x) (memset(x, 0, sizeof(x)))
int d[MAXN];
void init() {
memset(d, INF, sizeof(d));
}
typedef pair<int,int> pii;
void dij(int s) {
init();
d[s] = 0;
priority_queue<pii> q;
q.push({-d[s], s});
while(!q.empty()) {
auto no = q.top(); q.pop();
int u = no.second;
for(auto ed : G[u]) {
int v = ed.to, td = ed.w;
if(d[v] > d[u]+td) {
d[v] = d[u] + td;
q.push({-d[v], v});
}
}
}
}
完整代码如下
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN ((int)1e4+7)
#define ll long long
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)
using namespace std;
#define show(x...) \
do { \
cout << "\033[31;1m " << #x << " -> "; \
err(x); \
} while (0)
void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
namespace FastIO {
char print_f[105];
void read() { }
void print() { putchar('\n'); }
template <typename T, typename... T2>
inline void read(T &x, T2 &... oth) {
x = 0;
char ch = getchar();
ll f = 1;
while (!isdigit(ch)) {
if (ch == '-') f *= -1;
ch = getchar();
}
while (isdigit(ch)) {
x = x * 10 + ch - 48;
ch = getchar();
}
x *= f;
read(oth...);
}
template <typename T, typename... T2>
inline void print(T x, T2... oth) {
ll p3=-1;
if(x<0) putchar('-'), x=-x;
do{
print_f[++p3] = x%10 + 48;
} while(x/=10);
while(p3>=0) putchar(print_f[p3--]);
putchar(' ');
print(oth...);
}
} // namespace FastIO
using FastIO::print;
using FastIO::read;
int n, m, Q, K;
struct Edge {
int to, w;
} ;
vector<Edge> G[MAXN];
#define cls(x) (memset(x, 0, sizeof(x)))
int d[MAXN];
void init() {
memset(d, INF, sizeof(d));
}
typedef pair<int,int> pii;
void dij(int s) {
init();
d[s] = 0;
priority_queue<pii> q;
q.push({-d[s], s});
while(!q.empty()) {
auto no = q.top(); q.pop();
int u = no.second;
for(auto ed : G[u]) {
int v = ed.to, td = ed.w;
if(d[v] > d[u]+td) {
d[v] = d[u] + td;
q.push({-d[v], v});
}
}
}
}
int main() {
#ifdef debug
freopen("test", "r", stdin);
// freopen("out_main", "w", stdout);
clock_t stime = clock();
#endif
read(n, m);
int u, v;
while(m--) {
read(u, v);
G[u].push_back({v, 1}), G[v].push_back({u, 1});
}
read(m);
while(m--) {
read(u);
dij(u);
double ans = 0;
for(int i=1; i<=n; i++)
if(i != u) ans += d[i];
printf("Cc(%d)=%.2lf\n", u, (n-1)/ans);
}
#ifdef debug
clock_t etime = clock();
printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
return 0;
}