原理就看书吧,看书吧,六度空间的解读好麻烦啊, 陈越姥姥的讲解赛高了。

“六度空间”理论又称作“六度分隔(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%

代码如下:

#include<stdio.h>
#include<stdlib.h>
#define ERROR -1   //标记错误,表示生成树不存在
#define MAXSIZE 100
#define MaxVertexNum 100
#define SIX 6 int Visited[MaxVertexNum];
typedef int Vertex;
typedef int WeightType;
typedef char DataType; typedef struct ENode *PtrToENode;
struct ENode{ Vertex V1, V2; //有向边  WeightType Weight; //权重
};
typedef PtrToENode Edge; typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{  Vertex Adjv; //邻接点下标 WeightType Weight; //边权重 PtrToAdjVNode Next;
}; typedef struct Vnode{  //顶点表头节点的定义 PtrToAdjVNode FirstEdge; //边表头指针 DataType Data; //存顶针的数据 //注意:很多情况下,顶点无数据,此时Data可以不用出现
}AdjList[MaxVertexNum ]; //AdjList是邻接表类型 typedef struct GNode *PtrToGNode;
struct GNode{ int Nv;//顶点数  int Ne;//边数 AdjList G;//邻接表
};
typedef PtrToGNode LGraph; typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode{int *Date;Position Front, Rear;int MAXSize;
};
typedef PtrToQNode Queue; Queue CreateQueue(int MAXSize)
{  Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Date = (int*)malloc(MAXSize*sizeof(int)); Q->Front = Q->Rear = 0;Q->MAXSize = MAXSize;return Q;
}  bool isFull(Queue Q)
{ return ((Q->Rear+1)%Q->MAXSize==Q->Front);
} bool IsEmpty(Queue Q)
{ return (Q->Front==Q->Rear);
} int DeleteQ(Queue Q)
{ if(IsEmpty(Q)) { printf("队列空");return ERROR;}else{ Q->Front = (Q->Front+1)%Q->MAXSize;//printf("Front = %d ", Q->Front);//printf("delete = %d\n",Q->Date[Q->Front]);return Q->Date[Q->Front];}
} bool AddQ(Queue Q, int X)
{ if(isFull(Q)) { printf("队列满");return false;} else{ Q->Rear = (Q->Rear+1)%Q->MAXSize;Q->Date[Q->Rear] = X;//   printf("Rear = %d ", Q->Rear);//  printf("add = %d \n", Q->Date[Q->Rear]);return true;}
} LGraph CreateGraph(int VertexNum)
{  Vertex V;  //初始化一个 VertexNum 个顶点但没有边的图 LGraph Graph;  Graph = (LGraph)malloc(sizeof(struct GNode));  Graph->Nv = VertexNum; Graph->Ne = 1;//初始化邻接表头指针 for(V=1; V<Graph->Nv; V++)   Graph->G[V].FirstEdge = NULL;  return Graph;
}  void InitializeVisited(int Nv)
{ Vertex V; for( V=1; V<=Nv; V++ ) { Visited[V] = false; // printf("**** = %d \n", V); }
} //Visited[]为全局变量,已经初始化为false
int SDS_BFS(LGraph Graph, Vertex S) //广度优先
{ Queue Q; Vertex V, Last, Tail;PtrToAdjVNode W;int Count, Level; Q = CreateQueue(MAXSIZE);//创建空列队,MAXSIZE为外部定义的常数 //访问顶点S:此处可根据具体访问需要改写 //Visit(S); Visited[S] = true;Count = 1;Level = 0;Last = S;AddQ(Q, S);//S入队 第一次只有头结点入队 while(!IsEmpty(Q)) {V = DeleteQ(Q);//弹出结点 //    printf(" [%d] ", V);for(W=Graph->G[V].FirstEdge; W; W = W->Next){ //对图中的每个顶点W //若W是V的邻接点且并未访问过 if(!Visited[W->Adjv])//若为被访问过 //Visit(W); { Visited[W->Adjv] = true; Count++; Tail=W->Adjv;//当前层尾 AddQ(Q, W->Adjv);//W->Adjv入队 } } if( V==Last ){Level++;//printf("%d ", Level);Last = Tail;}if(Level==SIX) break; }   //DestoryQueue(Q); return Count;
}  void SIX_Degrees_of_Separation( LGraph Graph )
{ Vertex V;int Count = 0;for(V=1; V<=Graph->Nv; V++){InitializeVisited(Graph->Nv);Count = SDS_BFS(Graph, V);//printf("\n");//printf("count = %d ", Count);printf("%d:", V);if( V<10 )printf("  ");elseprintf(" ");printf("%.2f%%\n", 100.0*(double)Count/(double)Graph->Nv);}
} void InsertEdge(LGraph Graph, Edge E)
{ PtrToAdjVNode NewNode; //插入边<V1, V2>//为V2建立新的邻接点                                                    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));                   NewNode->Adjv =E->V2;  //将V2插入V1的表头           NewNode->Next = Graph->G[E->V1].FirstEdge;      Graph->G[E->V1].FirstEdge = NewNode;                                                               //若是-无向图-还需议案插入<V2, V1>// 为V1建立新的邻接点 NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode)); NewNode->Adjv = E->V1; //将V1插入V2的表头 NewNode->Next = Graph->G[E->V2].FirstEdge; Graph->G[E->V2].FirstEdge = NewNode;
} LGraph BuildGraph()
{ LGraph Graph; Edge E; Vertex V; int Nv, i; scanf("%d", &Nv); //读入顶点个数 Graph = CreateGraph(Nv); scanf("%d", &(Graph->Ne)); //读入边数 if( Graph->Ne!=0 ) E = (Edge)malloc(sizeof(struct ENode));//建立边结点  //读入边,格式为“起点,终点, 权重”,插入邻接矩阵  for( i=0; i<Graph->Ne; i++) {                                                                                             scanf("%d %d", &E->V1, &E->V2); InsertEdge(Graph, E); }  return Graph;
}  int main()
{LGraph Graph = BuildGraph();SIX_Degrees_of_Separation(Graph);return 0;
}

编译器:DEV C++

六度空间(广度优先遍历 · 数据结构 · 图)相关推荐

  1. 图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...

    头文件 #pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_ #define MAX_VERTE ...

  2. 有向图的广度优先遍历_图的两种遍历方式

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  3. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索

    什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...

  4. 【数据结构-图】1.图的构造和遍历(基本理论+代码)

    一.图的基本概念 图: 图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交.它们亦可写成V(G)和E(G).其中,顶集的元素被称 ...

  5. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...

  6. Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

    一,简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫 ...

  7. a - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_数据结构--图

    故事凌 今天 基本知识点 图可说是所有数据结构里面知识点最丰富的一个, 自己笨的知识点如下: 阶(oRDER), 度: 出度(out-Degree), 入度(in-Degree) 树(Tree), 森 ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

  9. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  10. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

最新文章

  1. DIY敷脸亲身示范做法 - 生活至上,美容至尚!
  2. 自建分布式存储新选择,性能是Ceph的1.84倍
  3. MPMoviePlayerController 电影播放器
  4. t66y.buzz index.php,6.FizzBuzz
  5. 功率电感器基础讲座-第1章-2_转载自村田官网
  6. 美国WH在明尼苏达州最大光伏阵列完工
  7. 光纤收发器不同品牌之间的兼容性互通
  8. [css] scroll-snap-align属性的应用场景是什么?
  9. 朴素贝叶斯法(Naive Bayes,NB)
  10. oracle日期大于3个月,用三个月时间做oracle实验,养成实验习惯
  11. Spring构建微服务
  12. Lesson 2 Gradient Desent
  13. 游戏设计创造对话探秘之迭代
  14. 64位windows系统 asp.net 对word Com 组件访问的设计.对于word2010/2007同样适用
  15. Python代码加密方案总结(巨全面和详细)
  16. 1024程序员节:心疼被段子手黑得最惨的他们
  17. b站修改密码服务器错误,提示账号或者密码错误,无法正常登陆
  18. 一个用于网络摄像机的开源软件 --- mjpg-streamer
  19. php mysql 占位符_PDO中预处理语句占位符的使用
  20. Eclipse Java EE+Tomcat问题和Apache整合Tomcat

热门文章

  1. iMazing iOS设备管理软件中文语言设置
  2. gps测试软件用法,gps测量仪器使用方法及教程
  3. python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
  4. Python函数学习心得
  5. 简易交通灯控制器Verilog
  6. oracle_身份证有效性校验
  7. maya中英转换插件1.3 更新发布及教程
  8. C# ZPL命令 实现打印中文
  9. 时钟芯片DS1302的原理及使用
  10. voip和rtc_VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】