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] 复杂网络分析总结
在我们的现实生活中,许多复杂系统都可以建模成一种复杂网络进行分析,比如常见的电力网络.航空网络.交通网络.计算机网络以及社交网络等等.复杂网络不仅是一种数据的表现形式,它同样也是一种科学研究的手段.复 ...
随机推荐
- 记一次vue2项目部署nginx静态文件404解决过程
github上下的一个vue2的项目,运行可以的,webpack打包后,nginx请求报错: 发现路径很奇怪啊,所以果断来到build.js文件中看看是不是哪里不对. 已经一番引用查找: 发现在这里配 ...
- 将本地jar包添加到maven中
将需要引入的jar包拷贝到maven项目的WEB-INF/lib中 在pom.xml中配置如下: <dependency> <groupId>com.xxxxx.union&l ...
- java中Xml、json之间的相互转换
旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...
- 切换样式.toggleClass()
切换样式.toggleClass() 在做某些效果的时候,可能会针对同一节点的某一个样式不断的切换,也就是addClass与removeClass的互斥切换,比如隔行换色效果 jQuery提供一个to ...
- vue - webpack.dev.conf.js
描述:开发时的配置.(配置开发时的一些操作) 例如这里,是否自动打开浏览器(默认true) 'use strict' // build/util.js const utils = require('. ...
- 课程分享 企业普及版贝斯OA与工作流系统
企业普及版贝斯OA与工作流系统 基于J2EE+JBPM3.x/JBPM4.3+Flex流程设计器+Jquery+授权认证企业普及版贝斯OA与工作流系统 假设对这个课程有兴趣的.能够和我联系.QQ205 ...
- Odoo,OpenERP widget标签
Odoo,OpenERP widget标签 widget="statusbar" 头部状态条标签 widget="email" 电子邮件地址标签 widget ...
- 为什么用strlcpy取代strncpy
为什么用strlcpy取代strncpy 标签: C, C语言, strlcpy, strncpy 标题: 为什么用strlcpy取代strncpy作者: Demon链接: http://demon. ...
- JMX 学习
http://blog.csdn.net/qiao000_000/article/category/763467
- CentOS搭建nginx与nginx-rtmp-module搭建流媒体服务器
文章地址:http://blog.csdn.net/zph1234/article/details/52846223 本次搭建流媒体使用的环境是centos 7.0+nginx:让我们一起开始奇妙的流 ...