六度空间理论(数据结构图,c语言版)

六度空间理论

  • 一、实验题目
    • 1.案例分析
    • 2.案例实现
    • 3.算法步骤
    • 4.算法描述
  • 二、工具环境
  • 三、实验代码

一、实验题目

六度空间理论是一个数学领域的猜想,又称为六度分割理论 (Six Degrees of Separation)。六度空间理论是20世纪60年代由美国的心理学家米格兰姆(Stanley Milgram) 提出的,理论指出:你和任何一个陌生人之间所间隔的人不会超过6个,也就是说,最多通过6个中间人你就能够认识任何一个陌生人。

1.案例分析

六度空间理论的数学模型属于图结构,我们把六度空间理论中的人际关系网络图抽象成一个不带权值的无向图G, 用图G 中的一个顶点表示一个人,两个人 ”认识” 与否,用代表这两个人的顶点之间是否有一条边来表示。这样六度空间理论问题便可描述为:在图 G 中任意两个顶点之间都存在一条路径长度不超过7的路径。 在实际验证过程中,可以通过测试满足要求的数据达到一定的百分比(比如 99.5%) 来进行验证。 这样我们便把待验证六度空间理论问题描述为:在图G 中,任意一个顶点到其余 99.5%以上的顶点都存在一条路径长度不超过 7 的路径。比较简单的一种验证方案是:利用广度优先搜索方法, 对任意一个顶点,通过对图 G的 "7层”遍历,就可以统计出所有路径长度不超过 7 的顶点数 从而得到这些顶点在所有顶点中的所占比例。

2.案例实现

算法中有关数据结构的定义如下:

// - - - -图的邻接表存储表示 - - - -
#define MVNum 100 //最大顶点数

typedef struct ArcNode  //边结点
{
    
	int adjvex;  //该边所指向的顶点的位置
	struct ArcNode* nextarc; //指向下一条边的指针
	//Otherinfo info; //和边相关的信
}ArcNode; 

typedef struct VNode //顶点信息
{
    
	//VerTexType data; 
	ArcNode *firstarc;	//指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型

typedef struct  //邻接表
{
   
	AdjList vertices; 
	int vexnum,arcnum;//图的当前顶点数和边数 
}ALGraph;

3.算法步骤

1.完成系列初始化工作:设变量 Visit_Num 用来记录路径长度不超过 7 的顶点个数,初值为0; Start 为指定的一个起始顶点, 置 visited[Start]的值为 true, 即将 Start 标记为六度顶点的始点;辅助队列 Q 初始化为空,然后将 Start 进队。
2.当队列Q非空,且循环次数小千7时,循环执行以下操作(统计路径长度不超过7的顶点个数):
• 队头顶点u出队;
• 依次检查 u 的所有邻接点 w, 如果 visited[w]的值为 false, 则将w标记为六度顶点;
• 路径长度不超过7的顶点个数 Visit_Num 加1 ;
• 将w进队。
3.退出循环时输出从顶点Start出发,到其他顶点长度不超过7的路径的百分比。

4.算法描述

void SixDegree_BFS(Graph G,int Start) 
{
   //通过广度优先搜索方法遍历G来验证六度空间理论,Start为指定的一个起点
	Visit_Num=O; //记录路径长度不超过7的顶点个数
	visited[Start]=true; //置顶点Start访问标志数组相应分址值为true
	InitQueue(Q); //辅助队列Q初始化, 置空
	EnQueue(Q,Start); //Start进队
	for(len=l;len<=7 && !QueueEmpty(Q);len++)//统计路径长度不超过7的顶点个数
	{
   
		DeQueue(Q,u}; //队头顶点u出队
		for(w=FirstAdjVex(G,u);w>=O;w=NextAdjVex(G,u,w)) 
		{
   //依次检查u的所有邻接点w, FirstAdjVex(G,u)表示u的第一个邻接点
		 //NextAdjVex(G,u,w)表示u相对于w的下一个邻接点,w匀表示存在邻接点
			if(!visited[w]) //w为u的尚未访问的邻接顶点
			{
   
				visited[w]=true; //将w标记为六度顶点
				Visit_Num++; //路径长度不超过7的顶点个数加1
				EnQueue(Q,w); //w进队
			}//if 
		}
	}//结束至多7次for循环
	cout<<1OO*

你可能感兴趣的:(数据结构,c语言,数据结构,图论,c语言)