题目

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


图1 六度空间示意图

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

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%

运行效果

Case Hint Result Run Time Memory
0 sample 简单一条链 Accepted 2 ms 384 KB
1 不连通 Accepted 2 ms 416 KB
2 一般图 Accepted 3 ms 416 KB
3 最小N和M Accepted 2 ms 416 KB
4 最大N和M Accepted 497 ms 2592 KB

程序

#include<iostream>
using namespace std;#define MaxVertexNum 10000//最多顶点(结点)数
#define MaxDistance 6//BFS广度优先搜索允许遍历到的层数
#define DefaultWeight 1//无边的权重要求,则默认为1
#define QERROR 0//队列发生错误typedef int Vertex;//用顶点下标表示顶点
typedef int WeightType;//边的权重//定义图的边
typedef struct ENode *PtrToENode;
struct ENode{Vertex V1, V2; //有向边<V1,V2>WeightType Weight;//权重
};
typedef PtrToENode Edge;//邻接点的定义
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{Vertex AdjV; //邻接点的下标WeightType Weight;//边权重PtrToAdjVNode Next;//指向下一个邻接点的指针
};//顶点表头的定义
typedef struct Vnode{PtrToAdjVNode FirstEdge;//变表头指针
} AdjList[MaxVertexNum];//AdjList是邻接表类型//图结点的定义
typedef struct GNode *PtrToGNode;
struct GNode{int Nv;//顶点数int Ne;//边数bool *visited;//顶点被访问状态数组的指针AdjList G;//邻接表
};
typedef PtrToGNode LGraph;//以邻接表方式存储的图类型//队列的结点定义
typedef struct Node *PtrToNode;
struct Node{Vertex Data;//队列结点存储的数据PtrToNode Next;//指向下一个队列结点的指针
};
typedef PtrToNode Position;//队列的定义
struct QNode{Position Front, Rear;//队列的头结点和尾结点int MaxSize;//队列的最大可存储大小
};
typedef struct QNode *Queue;//以链表的形式实现队列LGraph CreateGraph(int Nv);
void InsertEdge(LGraph Graph, Edge E);
void BFSToSix(LGraph Graph);
int BFS(LGraph Graph, Vertex v);
Queue CreateQueue(int MaxSize);
bool QIsEmpty(Queue Q);
Vertex DeleteQ(Queue Q);
void AddQ(Queue Q, Vertex v);int main()
{/*//测试用例int N;int M;N = 10;LGraph Graph;Graph = CreateGraph(N);M = 9;int V1Arr[M] = {1,2,3,4,5,6,7,8,9};int V2Arr[M] = {2,3,4,5,6,7,8,9,10};Edge E;E = new ENode;for(int e=0; e<M; e++){E->V1 = V1Arr[e];E->V2 = V2Arr[e];E->Weight = DefaultWeight;InsertEdge(Graph, E);}BFSToSix(Graph);*///正式应用int N, M;LGraph Graph;Edge E;cin >> N; //输入结点总数Graph = CreateGraph(N); //创建无边图cin >> M; //输入边的个数E = new ENode;for(int i=0; i<M; i++){cin >> E->V1;cin >> E->V2;E->Weight = DefaultWeight;InsertEdge(Graph, E);}BFSToSix(Graph);//六度分隔理论模拟return 0;
}void BFSToSix(LGraph Graph)
{int SixVertexNum;float percent;if(Graph->Nv != 0){for(Vertex v=1; v<Graph->Nv; v++){//在六步内可遍历到的顶点数(其中还要加上结点本身)SixVertexNum = BFS(Graph, v) +1;//在六步内可遍历到的顶点数占总结点数的百分比(结点从1开始,需要减去0这个无用结点)percent = float(SixVertexNum)/float(Graph->Nv-1);printf("%d: %.2f%\n", v, percent*100);//清空结点被遍历状态for(int i=0; i<Graph->Nv; i++) Graph->visited[i] = false;}}
}int BFS(LGraph Graph, Vertex v)
{PtrToAdjVNode w;int D = 0;int SixVertexNum = 0;Queue Q;Q = CreateQueue(MaxVertexNum);//创建队列Graph->visited[v] = true;AddQ(Q, v);AddQ(Q, 0);//插入队列中的0,用于表示新的一层的开始++D;//所在的层数while(!QIsEmpty(Q)){v = DeleteQ(Q);if(v == 0 && D >= MaxDistance) break; //表示层数已超过6if(v == 0 && D < MaxDistance){//层数还未超过6AddQ(Q, 0);++D;continue;}for(w=Graph->G[v].FirstEdge; w != NULL; w=w->Next){if(!Graph->visited[w->AdjV]){Graph->visited[w->AdjV] = true;AddQ(Q, w->AdjV);++SixVertexNum;}}}return SixVertexNum;
}void InsertEdge(LGraph Graph, Edge E)
{PtrToAdjVNode NewNode;++Graph->Ne;//插入<V1,V2>NewNode = new AdjVNode;NewNode->AdjV = E->V2;NewNode->Weight = E->Weight;NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;//插入<V2,V1>NewNode = new AdjVNode;NewNode->AdjV = E->V1;NewNode->Weight = E->Weight;NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}LGraph CreateGraph(int N)
{LGraph Graph;Graph = new GNode;Graph->Nv = N+1; //结点从1开始Graph->Ne = 0;Graph->visited = new bool [N+1];for(int i=1; i<Graph->Nv; i++) Graph->visited[i] = false;for(int v=1; v<Graph->Nv; v++) Graph->G[v].FirstEdge = NULL;return Graph;
}Queue CreateQueue(int MaxSize)
{Queue Q;Q = new QNode;Q->Front = Q->Rear = NULL;Q->MaxSize = MaxSize;return Q;
}bool QIsEmpty(Queue Q)
{return (Q->Front == NULL);
}void AddQ(Queue Q, Vertex v)
{Position NewNode;NewNode = new Node;NewNode->Data = v;NewNode->Next = NULL;if(QIsEmpty(Q)){Q->Front = NewNode;Q->Rear = NewNode;}else{Q->Rear->Next = NewNode;Q->Rear = NewNode;}
}Vertex DeleteQ(Queue Q)
{Position FrontNode;Vertex FrontData;if( QIsEmpty(Q)){return QERROR;}else{FrontNode = Q->Front;if( Q->Front == Q->Rear)Q->Front = Q->Rear = NULL;elseQ->Front = Q->Front->Next;FrontData = FrontNode->Data;delete FrontNode;return FrontData;}}

数据结构-六度空间(模拟六度分隔理论)相关推荐

  1. 小世界效应:从凯文·贝肯到六度分隔理论(1)

    斯坦福的老师很喜欢用一些生活的小案例来引入课题,小的Project也不例外. 凯文·贝肯是好莱坞的大牌明星,这次Project也得从他说起.虽然贝肯在娱乐圈可谓呼风唤雨,人气也是相当的高,但他与奥斯卡 ...

  2. 什么是社会性网络?什么是六度分隔理论?

    2007年05月23日 星期三 下午 03:13 根据维基百科的解释,"社会网络(Social Networking:SN)"是指个人之间的关系网络. 据一些不系统的分析,社会网络 ...

  3. Python实现“维基百科六度分隔理论“之基础爬虫

    预备阅读:Python的urllib高级用法  Python中Beautiful Soup的用法  Python中的正则表达式模块re 前言 前面学习了urllib和beautifulsoup来进行数 ...

  4. 关系和纽带:六度分割理论【存疑2处】

    查资料的时候看到"六度分割理论",之前就听说过,只知道是什么意思,但没详细了解过. 维基百科上说"六度分割理论"(也叫"六度空间理论"或&q ...

  5. 从六度分隔到无尺度网络

    1. 随机网络 现在我们来思考一个关于SNS形成的问题:我的朋友是从那里来的? 大约的故事是这样的: 从前,有个叫 mxwu的小孩出生在了中国某个二线城市的小院子里.他不知道为什么上帝没有把他安排在美 ...

  6. SNS背后的科学(1)从六度分隔到无尺度网络

    http://socialbeta.com/t/the-wisdom-of-sns-part-one.html 此系列Blog连载于我的Blog和SocialBeta.欢迎各位关注SNS,社会化媒体的 ...

  7. 【收藏】六度分隔、六度空间(Six Degrees of Separation)理论

    你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人. 社会网络其实并不高深,它的理论基础正是"六度分隔".而社会性软件则是建立在真实的 ...

  8. 21级数据结构考前模拟题

    说明: 此试卷为21级数据结构考前模拟题,老师并未给出标准答案,故以下所有答案均为博主给出,并只供参考,不保证其正确性!!! 一. 单选题 (单选题) 快速排序方法在( )情况下最不利于发挥其长处. ...

  9. qu(判定操作序列)NOIP模拟 数据结构判断 模拟

    [问题描述] 给你一个操作序列,问这个维护操作序列的数据结构是哪一种? [输入格式] 第一行是一个正整数?代表操作数目. 接下来?行,每行两个正整数???, ?.如果??? = 1,代表我们将?加入数 ...

  10. 51822模拟ble广播-理论

    http://blog.chinaunix.net/uid/28852942/cid-219646-list-1.html 这讲教程介绍如何使用51822的radio部分来模拟实现ble广播功能,并使 ...

最新文章

  1. cannot import name 'etree' from 'lxml'
  2. setTimeout() 方法的返回值
  3. centos图形化桌面的文件在哪_CentOS 安装图形桌面
  4. 前端学习(1782):前端调试之canvas简介
  5. 解决在sample文件夹里面写代码,在测试的时候因为virtual原因,make编译报错
  6. 【转载】优秀文章转载集合
  7. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...
  8. 应用filestream设置时存在未知错误_开机黑屏?常见启动黑屏错误的中文解释!学习电脑知识电脑小匠...
  9. terminal mysql 停止_转载MySQL之终端(Terminal)管理MySQL
  10. hc sr04流程图_HC-SR04超声模块示例代码/原理图/说明书等全套资料
  11. Tensorflow2梯度带tape.Gradient的用法_(全面,深入)
  12. 题解 P3835 【【模板】可持久化平衡树】
  13. Mac 安装JDK 8
  14. React Native的缓存和下载
  15. 快速开发大热风潮之下 这免费的羊毛不来薅薅?
  16. 技术江湖--讲座笔记
  17. webpack5之webpack-dev-server(实时重新加载(live reloading)
  18. 如何成为一名云计算工程师
  19. 2018-ACM省赛
  20. 阿尔法围棋击败人类是计算机在那方面的应用,阿尔法围棋战胜人类:人工智能又一胜利...

热门文章

  1. android pin码 经典蓝牙_请问 蓝牙 的自动设置PIN码 功能该怎么实现。
  2. ios微信多开 服务器,iOS微信双开(多开)
  3. [翻译]IAdaptable是什么?
  4. 微信小程序前端设计(超级实用哦)
  5. 异步bus交互(一)— 两级DFF同步器
  6. 华为手机相册怎么镜像翻转_手机相册里的照片误删怎么恢复?简单操作就搞定...
  7. liang-barsky_C和C ++中的Liang Barsky线裁剪算法
  8. [高数]y=arccosx,y=arcsinx和y=arctanx的图像
  9. go+beego+gorilla实现上传保存图片
  10. 【剑桥英语I优加】剑桥pet相当于什么级别