PAT007 六度空间
“六度空间”理论又称作“六度分隔(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: 70.00% |
| 2 |
10 8 |
1: 70.00% |
| 3 |
11 10 |
1: 100.00% |
| 4 |
2 1 |
1: 100.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的每个邻接点访问状态
return count;
}
对所有节点实现一次
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、运行结果:

PAT007 六度空间的更多相关文章
- PTA 06-图3 六度空间 (30分)
"六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔 ...
- PTA 7-7 六度空间(广搜)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...
- 六度空间(MOOC)
六度空间: “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五 ...
- C 六度空间理论的实现
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...
- 【PTA 天梯赛训练】六度空间(广搜)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...
- pat05-图3. 六度空间 (30)
05-图3. 六度空间 (30) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard “六度空间”理论又称作“六度分隔(Six Degrees ...
- PTA 7-7 六度空间 (30分)
PTA 7-7 六度空间 (30分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:& ...
- 深度|作为C端应用的代表,成功的陌生社交应用是什么样子的?
作 为C端应用的代表,成功的陌生社交应用是什么样子的?活跃用户数?收益回报率?在实际社交产品设计中,我们一直为这些所谓的KPI左右,具体到设计行为 上:摆弄相应的界面元素,优化一下文案.页面流,但却很 ...
- [Network Analysis] 复杂网络分析总结
在我们的现实生活中,许多复杂系统都可以建模成一种复杂网络进行分析,比如常见的电力网络.航空网络.交通网络.计算机网络以及社交网络等等.复杂网络不仅是一种数据的表现形式,它同样也是一种科学研究的手段.复 ...
随机推荐
- 转: 关于android 机型适配的问题
转: http://www.csdn.net/article/2015-09-08/2825645
- UVA 10441 - Catenyms(欧拉道路)
UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...
- block高级功能
/* -*- c++ -*- */ /* * Copyright 2004,2007,2009,2010,2013 Free Software Foundation, Inc. * * This fi ...
- Android模糊演示样例-RenderScript-附效果图与代码
本文链接 http://blog.csdn.net/xiaodongrush/article/details/31031411 參考链接 Android高级模糊技术 http://s ...
- 新手IOS tweak越狱app开发记录
需要改变原先程序功能流程的话,是要用到Logos Tweak 开发.另外,.在苹果商城下载到的app,不能直接拿来分析.需要先做一定的前期准备.网上有很多相关的写第一个越狱插件的文章,这里就不在赘言了 ...
- 学 Vim 时希望早点知道的建议
来自wechat 从 2009 年开始,我就一直把 Vim 当做我的主要(唯一)文本编辑器.在过去的这些年,我学到了很多好用的 Vim 技巧,它们令我感觉相见恨晚,因为它们极大地提高了我的文本编辑效率 ...
- Android实战技巧之三十八:Handler使用中可能引发的内存泄漏
问题描写叙述 曾几何时,我们用原来的办法使用Handler时会有以下一段温馨的提示: This Handler class should be static or leaks might occur ...
- 使用PostSharp在.NET平台上实现AOP
摘自:http://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html 本文首先介绍AOP(面向方面编程)的相关概念及理论,然后 ...
- 轻量级php框架phpk v1.0发布
phpk框架简介 PHPK是一个简单易用,易于扩展的轻量级PHP框架.phpk不仅仅是一个php框架,也是一个js框架,内置一套全新的js内库,完全摒弃了庞大的jquery,所有的前端都是一个全新的微 ...
- Latex中设置字体颜色
在用Latex时,想要使用不同颜色来突出某些关键点,有以下三种方案: 1.组合red.green和blue的值合成我们想要的颜色 \usepackage{color} \textcolor[rgb]{ ...