六度空间理论(数据结构图,c语言版)
一、实验题目
六度空间理论是一个数学领域的猜想,又称为六度分割理论 (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;
}ArcNode;
typedef struct VNode
{
ArcNode *firstarc;
}VNode,AdjList[MVNum];
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)
{
Visit_Num=O;
visited[Start]=true;
InitQueue(Q);
EnQueue(Q,Start);
for(len=l;len<=7 && !QueueEmpty(Q);len++)
{
DeQueue(Q,u};
for(w=FirstAdjVex(G,u);w>=O;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
visited[w]=true;
Visit_Num++;
EnQueue(Q,w);
}
}
}
cout<<1OO*Visit_Num/G.vexnum;
}
二、工具环境
Window10操作系统,Microsoft Visual C++2010学习版 集成开发环境,C语言
三、实验代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct{
int *vex;
int front;
int rear;
}SqQueue;
Status InitQueue (SqQueue *Q);
Status EnQueue(SqQueue *Q, int e);
Status DeQueue(SqQueue *Q, int *e);
Status QueueEmpty(SqQueue Q);
#define MVNum 100
typedef struct ArcNode
{
int adjvex;
struct ArcNode* nextarc;
}ArcNode;
typedef struct VNode
{
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
void CreateUDG(ALGraph *G);
int FirstAdjVex(ALGraph G,int v);
int NextAdjVex(ALGraph G,int u,int w);
void SixDegree_BFS(ALGraph G,int Start);
void ShowResults(ALGraph G);
int main()
{
ALGraph G;
CreateUDG(&G);
ShowResults(G);
return 0;
}
Status InitQueue (SqQueue *Q)
{
Q->vex=(int *)malloc(MAXSIZE*sizeof(int));
if(!Q->vex) exit(OVERFLOW);
Q->front=Q->rear=0;
return OK;
}
Status EnQueue(SqQueue *Q, int e)
{
if ((Q->rear+1)%MAXSIZE==Q->front)
return ERROR;
Q->vex[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue *Q, int *e)
{
if(Q->front==Q->rear) return ERROR;
*e=Q->vex[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) return OK;
else return ERROR;
}
void CreateUDG(ALGraph *G)
{
int i,j,k,v1,v2;
ArcNode *p1=NULL,*p2=NULL;
printf("输入点和边\n");
scanf("%d %d",&((*G).vexnum),&((*G).arcnum));
for(i=0;i<(*G).vexnum;++i)
{
(*G).vertices[i].firstarc=NULL;
}
for(k=0;k<(*G).arcnum;++k)
{
printf("输入俩顶点\n");
scanf("%d %d",&v1,&v2);
i=v1-1; j=v2-1;
p1=(ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex=j;
p1->nextarc=(*G).vertices[i].firstarc; (*G).vertices[i].firstarc=p1;
p2=(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex=i;
p2->nextarc=(*G).vertices[j] .firstarc; (*G).vertices[j].firstarc=p2;
}
}
int FirstAdjVex(ALGraph G,int v)
{
if(!G.vertices[v].firstarc)
{
return -1;
}
return G.vertices[v].firstarc->adjvex;
}
int NextAdjVex(ALGraph G,int u,int w)
{
ArcNode *p;
p=G.vertices[u].firstarc;
while(p && p->adjvex!=w){
p=p->nextarc;
}
if(p->nextarc!=NULL)
{
return p->nextarc->adjvex;
}
return -1;
}
void SixDegree_BFS(ALGraph G,int Start)
{
int Visit_Num=0,len,u,w;
int visited[MVNum]={0} ;
SqQueue Q;
visited[Start]=1;
InitQueue(&Q);
EnQueue(&Q,Start);
for(len=1;len<=7 && !QueueEmpty(Q) ;len++)
{
DeQueue(&Q,&u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
visited[w]=1;
Visit_Num++;
EnQueue(&Q,w);
}
}
}
printf("第%d个点,%.2f%%\n",Start+1,100*Visit_Num/(float)G.vexnum);
}
void ShowResults(ALGraph G)
{
int Start;
printf("从顶点出发,到其他顶点长度不超过7的路径的百分比\n");
for(Start=0;Start<G.vexnum;Start++)
{
SixDegree_BFS(G,Start);
}
}
|