六度空间(广度优先遍历 · 数据结构 · 图)
原理就看书吧,看书吧,六度空间的解读好麻烦啊, 陈越姥姥的讲解赛高了。
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤104,表示人数)、边数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++
六度空间(广度优先遍历 · 数据结构 · 图)相关推荐
- 图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...
头文件 #pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_ #define MAX_VERTE ...
- 有向图的广度优先遍历_图的两种遍历方式
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索
什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...
- 【数据结构-图】1.图的构造和遍历(基本理论+代码)
一.图的基本概念 图: 图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交.它们亦可写成V(G)和E(G).其中,顶集的元素被称 ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...
- Python实现深度优先遍历(DFS)和广度优先遍历(BFS)
一,简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫 ...
- a - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_数据结构--图
故事凌 今天 基本知识点 图可说是所有数据结构里面知识点最丰富的一个, 自己笨的知识点如下: 阶(oRDER), 度: 出度(out-Degree), 入度(in-Degree) 树(Tree), 森 ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索
线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)
~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...
最新文章
- DIY敷脸亲身示范做法 - 生活至上,美容至尚!
- 自建分布式存储新选择,性能是Ceph的1.84倍
- MPMoviePlayerController 电影播放器
- t66y.buzz index.php,6.FizzBuzz
- 功率电感器基础讲座-第1章-2_转载自村田官网
- 美国WH在明尼苏达州最大光伏阵列完工
- 光纤收发器不同品牌之间的兼容性互通
- [css] scroll-snap-align属性的应用场景是什么?
- 朴素贝叶斯法(Naive Bayes,NB)
- oracle日期大于3个月,用三个月时间做oracle实验,养成实验习惯
- Spring构建微服务
- Lesson 2 Gradient Desent
- 游戏设计创造对话探秘之迭代
- 64位windows系统 asp.net 对word Com 组件访问的设计.对于word2010/2007同样适用
- Python代码加密方案总结(巨全面和详细)
- 1024程序员节:心疼被段子手黑得最惨的他们
- b站修改密码服务器错误,提示账号或者密码错误,无法正常登陆
- 一个用于网络摄像机的开源软件 --- mjpg-streamer
- php mysql 占位符_PDO中预处理语句占位符的使用
- Eclipse Java EE+Tomcat问题和Apache整合Tomcat
热门文章
- iMazing iOS设备管理软件中文语言设置
- gps测试软件用法,gps测量仪器使用方法及教程
- python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
- Python函数学习心得
- 简易交通灯控制器Verilog
- oracle_身份证有效性校验
- maya中英转换插件1.3 更新发布及教程
- C# ZPL命令 实现打印中文
- 时钟芯片DS1302的原理及使用
- voip和rtc_VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】