“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图6.4所示。


图6.4 六度空间示意图

“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。

假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。

输入格式说明:

输入第1行给出两个正整数,分别表示社交网络图的结点数N (1<N<=104,表示人数)、边数M(<=33*N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。

输出格式说明:

对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

样例输入与输出:

序号 输入 输出
1
 
10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

 
170.00%
280.00%
390.00%
4100.00%
5100.00%
6100.00%
7100.00%
890.00%
980.00%
1070.00%

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

 
170.00%
280.00%
380.00%
480.00%
580.00%
680.00%
780.00%
870.00%
920.00%
1020.00%
3
 
11 10
1 2
1 3
1 4
4 5
6 5
6 7
6 8
8 9
8 10
10 11

 
1100.00%
290.91%
390.91%
4100.00%
5100.00%
6100.00%
7100.00%
8100.00%
9100.00%
10100.00%
1181.82%

4
 
2 1
1 2

 
1100.00%
2100.00%

算法思路:

1、对每个节点进行广度优先搜索

2、搜索过程中累计访问的节点数

3、需要记录层次,仅计算6层以内的节点数

分析:

1、伪码描述

针对单个节点的BFS

 int BFS ( Vertex V )
{
visited[V] = true; count = ;
level = ; last = V;
Enqueue(V, Q);
while(!IsEmpty(Q)){
V = Dequeue(Q);
for( V 的每个邻接点 W )
if( !visited[W] ) {
visited[W] = true;
Enqueue(W, Q); count++;
tail = W;
}
if( V == last ) {
level++; last = tail;
}
if( level == ) break;
}
Reset(V) // 重置V的每个邻接点访问状态
returncount;
}

对所有节点实现一次

 void SDS() {
for V in G {
count = BFS(V)
print(count)
}
}

2、实现代码

 #pragma mark - 六度空间
#include <math.h>
#include <stdio.h>
#include <stdbool.h>
typedef struct {
int index;
bool visited;
void *next;
} SDSVertex;
int a[][];
SDSVertex v_sds[];
int pNum = , edgeNum = ;
typedef struct queue {
SDSVertex *front;
SDSVertex *rear;
} Queue;
Queue *createQueue()
Queue *queue = (Queue *)malloc(sizeof(Queue));
queue->front = NULL;
queue->rear = NULL;
return queue;
}
void addToQueue(Queue *queue, SDSVertex *node)
{
if (!(queue->rear)) {
queue->rear = node;
} else {
queue->rear->next = node;
queue->rear = node;
}
if (!(queue->front)) {
queue->front = node;
}
}
SDSVertex *deleteFromQueue(Queue *queue)
{
SDSVertex *temp = queue->front;
if (temp) {
queue->front = queue->front->next;
return temp;
} else {
return NULL;
}
}
int isEmptyQueue(Queue *queue)
{
if (queue->front == NULL) {
return ;
} else {
return ;
}
}
int BFS_SDS(int i)
{
SDSVertex *v = &v_sds[i];
v->visited = true;
int level = , count = ;
SDSVertex *last = v, *tail = NULL;
Queue *queue = createQueue();
addToQueue(queue, v);
while (!isEmptyQueue(queue)) {
SDSVertex *vertex = deleteFromQueue(queue);
for (int j = ; j <= pNum; j++) {
int hasEdge = a[vertex->index][j];
if (hasEdge && !v_sds[j].visited) {
v_sds[j].visited = true;
addToQueue(queue, &v_sds[j]); count++;
tail = &v_sds[j];
}
}
if (vertex == last) {
level++; last = tail;
}
if (level == ) {
break;
}
}
for (int i = ; i <= pNum; i++) {
v_sds[i].visited = false;
v_sds[i].next = NULL;
}
return count;
}
int main()
{
scanf("%d %d", &pNum, &edgeNum);
for (int i = ; i <= edgeNum; i++) {
int from = , to = ;
scanf("%d %d", &from, &to);
a[from][to] = ;
a[to][from] = ;
}
for (int i = ; i <= pNum; i++) {
v_sds[i].visited = false;
v_sds[i].index = i;
v_sds[i].next = NULL;
}
int count = -;
for (int i = ; i <= pNum; i++) {
count = BFS_SDS(i);
printf("%d: %.2f%%\n", i, count * 100.0 / pNum);
}
}

3、运行结果:

C 六度空间理论的实现的更多相关文章

  1. PTA 06-图3 六度空间 (30分)

    "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔 ...

  2. PTA 7-7 六度空间(广搜)

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  3. 六度空间(MOOC)

    六度空间: “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五 ...

  4. PAT007 六度空间

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  5. 【PTA 天梯赛训练】六度空间(广搜)

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  6. pat05-图3. 六度空间 (30)

    05-图3. 六度空间 (30) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard “六度空间”理论又称作“六度分隔(Six Degrees ...

  7. PTA 7-7 六度空间 (30分)

    PTA 7-7 六度空间 (30分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:& ...

  8. [Network Analysis] 复杂网络分析总结

    在我们的现实生活中,许多复杂系统都可以建模成一种复杂网络进行分析,比如常见的电力网络.航空网络.交通网络.计算机网络以及社交网络等等.复杂网络不仅是一种数据的表现形式,它同样也是一种科学研究的手段.复 ...

  9. python 爬虫(三)

    爬遍整个域名    六度空间理论:任何两个陌生人之间所间隔的人不会超过六个,也就是说最多通过五个人你可以认识任何一个陌生人.通过维基百科我们能够通过连接从一个人连接到任何一个他想连接到的人. 1. 获 ...

随机推荐

  1. Sweetkang 的机器学习实验室 (1)

    前言 近年来,Machine Learning 在许多领域上已然取得了可喜的成就,非常火热.就我个人来讲,有意将业余 Sport Programming 的范围扩展一下,譬如 Topcoder Mar ...

  2. getTextContent()方法会出现The method getTextContent() is undefined for the type Node 提示

    eclipse 中 如果加入了 其他了xfire 等其他xml解析包的话,使用org.w3c.dom.Node下的getTextContent()方法会出现The method getTextCont ...

  3. 5、Semantic-UI之基础按钮样式

    5.1 基础按钮样式   在Semantic-UI中定义了很多的按钮样式,可以通过class="ui button"来指定,也可以在class中指定颜色. 示例:定义基础按钮样式 ...

  4. SQL2008中sa账户无法登陆问题

    实验需要用Java与SQL Server连接,因为使用的 SQL 2008 Express Edition 是基于 Visual Studio2010 安装包安装时一起安装的,所以为了方便数据库的操作 ...

  5. mORMot使用synDBDataSet时字段类型不正确引起的问题

    当SQL表中的nvarchar字段类型内容为null时synDBDataSet使用ftwideMemo类型造成不能修改的问题,按下面红字修改synDBVCL.pas就可以: synDBVCL.pas ...

  6. 7z文件格式及其源码的分析(五)

    这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程.最近太忙了,好久没更新,都快忘了写到哪了.:) 这一篇就说说7z文件的尾头的生成方式吧. 上一篇已经讲了尾header的结构 ...

  7. uwsgi启动报错WARNING: Can't find section "uwsgi" in INI configuration file autotestsite_uwsgi.ini

    提示配置文件头部找不到 [uwsgi] 解决: 在最上方加上[uwsgi],有时候明明有标识,但是还是提示,那就再加一个

  8. LightOJ 1234 Harmonic Number(打表 + 技巧)

    http://lightoj.com/volume_showproblem.php?problem=1234 Harmonic Number Time Limit:3000MS     Memory ...

  9. [HNOI2010] 合唱队

    题目链接:https://www.luogu.org/problemnew/show/P3205 一个区间DP的题目. 设计状态为:\(dp1[i][j]\)表示当前区间为\([i,j]\),而且最后 ...

  10. lua 5.3 英文手册 google机器翻译版

    LUA Lua 5.3参考手册作者:Roberto Ierusalimschy,Luiz Henrique de Figueiredo,Waldemar Celes 版权所有©2015-2018 Lu ...