六、图(上):六度空间

2023-12-30 14:58
文章标签 空间 六度

本文主要是介绍六、图(上):六度空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 题目描述
  • 代码
  • 解题思路

题目描述

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

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

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

输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤1000​​ ,表示人数)、边数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<malloc.h>#define MaxVertexNum 1000
#define MaxEdgeNum 33
int visited[MaxVertexNum+1] = {0};
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;          /* 存顶点的数据,本题不需要出现*/
}AdjList[MaxVertexNum+1];       /* 定义顶点表头结点的数组 *//* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{int Nv;   /* 顶点数 */int Ne;   /* 边数   */AdjList G;/* G是顶点表头结点数组 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */LGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */Vertex V;LGraph Graph;Graph = (LGraph)malloc(sizeof(struct GNode));Graph->Nv = VertexNum;Graph->Ne = 0;/* 初始化邻接表头指针 */for (V=1; V<=Graph->Nv; ++V)Graph->G[V].FirstEdge = NULL;return Graph;
}void InsertEdge( LGraph Graph, Edge E )
{PtrToAdjVnode NewNode;/* 插入边 *//* 为V2建立新的邻接点 */NewNode = (PtrToAdjVnode)malloc(sizeof(struct AdjVnode));NewNode->AdjV = E->V2;//NewNode->Weight = E->Weight;/* 将V2插入V1的表头 */NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;/* 双向图,将V1插入V2的表头 */NewNode = (PtrToAdjVnode)malloc(sizeof(struct AdjVnode));NewNode->AdjV = E->V1;NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}LGraph BuildGraph()
{LGraph Graph;Edge E;Vertex V;int Nv, Ne, i;scanf("%d",&Nv);Graph = CreateGraph(Nv);scanf("%d",&Graph->Ne);if ( Graph->Ne ){E = (Edge)malloc(sizeof(struct ENode));for(i=0; i!=Graph->Ne; ++i){scanf("\n%d %d",&E->V1,&E->V2);InsertEdge( Graph, E );}}return Graph;
}Vertex Q[MaxVertexNum] = {0};
int First = 1, Last = 0;void Enqueue(Vertex V)
{Q[++Last] = V;
}Vertex Dequeue()
{Vertex V;V = Q[First++];return V;
}
int BFS( Vertex V, LGraph Graph)
{visited[V] = 1;int count = 1, level = 0, last = V, tail;Enqueue(V);while( First<=Last ){V = Dequeue();PtrToAdjVnode Node = Graph->G[V].FirstEdge;while(Node){if ( !visited[Node->AdjV] ){visited[Node->AdjV] = 1;Enqueue(Node->AdjV);++count;tail = Node->AdjV;}Node = Node->Next;}if ( V == last ){++level;last = tail;}if ( level == 6 ) break;}return count;
}void SDS(LGraph Graph)
{int count;double Per;Vertex V, j;for (V=1; V<=Graph->Nv; V++){count = BFS(V, Graph);Per = (float)count / Graph->Nv * 100;printf("%d: %.2f%%\n",V,Per);/* 重新初始化全局变量和队列 */for(j=0;j<=MaxVertexNum;++j)visited[j] = 0;First = 1, Last = 0;}
}int main()
{LGraph Graph = BuildGraph();SDS(Graph);return 0;
}

解题思路

1.判断层数的方法 在这里插入图片描述
图中1的所有邻接点依次入队列,关键是判断什么时候这一层的所有结点都出队列了,然后层数加1。方法是使用一个last和tail。在1的邻接点入队列的时候,始终让tail等于最新入队列的结点,最后tail就会指第一层的最后一个结点。让last等于这个tail,则判断出队列的结点是否等于last就能判断这一层是不是出完了。其他层类似。
2.队列和全局变量的重新初始化
定义队列Q[MaxVertexNum]和判断是否访问过结点的数组visited[MaxVertexNum]都是全局变量,第一次使用完之后一定要重新初始化(第149行),否则程序就会出现问题。

这篇关于六、图(上):六度空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553206

相关文章

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

win7系统中C盘空间缩水的有效处理方法

一、深度剖析和完美解决   1、 休眠文件 hiberfil.sys :   该文件在C盘根目录为隐藏的系统文件,隐藏的这个hiberfil.sys文件大小正好和自己的物理内存是一致的,当你让电脑进入休眠状态时,Windows 7在关闭系统前将所有的内存内容写入Hiberfil.sys文件。   而后,当你重新打开电脑,操作系统使用Hiberfil.sys把所有信息放回内存,电脑

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

[Linux]:环境变量与进程地址空间

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 环境变量 1.1 概念 **环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数,具有全局属性,可以被子继承继承下去。 如:我们在编写C/C++代码的时,在链接的时候,我们并不知

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

算法复杂度 —— 数据结构前言、算法效率、时间复杂度、空间复杂度、常见复杂度对比、复杂度算法题(旋转数组)

目录 一、数据结构前言 1、数据结构 2、算法 3、学习方法 二、 算法效率 引入概念:算法复杂度  三、时间复杂度 1、大O的渐进表示法 2、时间复杂度计算示例  四、空间复杂度 计算示例:空间复杂度 五、常见复杂度对比 六、复杂度算法题(旋转数组) 1、思路1 2、思路2 3、思路3 一、数据结构前言 1、数据结构         数据结构(D

Oracle 查看表空间名称及大小和删除表空间及数据文件方法

--1、查看表空间的名称及大小  SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size  FROM dba_tablespaces t, dba_data_files d  WHERE t.tablespace_name = d.tablespace_name  GROUP BY t.tablespace_na

气膜场馆:乡村振兴中的健康与经济新引擎—轻空间

随着乡村振兴战略的深入推进,气膜场馆作为新兴建筑形式,正在为农村地区带来全新的发展机遇。它不仅是乡村百姓锻炼身体的好去处,更是带动当地经济发展的强劲动力。 首先,气膜场馆为农村地区的居民提供了更多运动健身的机会。与传统体育设施相比,气膜场馆建设周期短、成本低,非常适合在乡村快速推广。通过提供羽毛球、篮球、排球等多种运动项目,村民可以在空闲时间增强体质,改善生活方式。这对于长期从事农业劳动的村

c++的名字空间

名字空间 什么是名字空间 在C语言中定义的全局变量、函数、结构、联合、枚举、枚举值、宏都在全局作用域下,所以当项目比较庞大时,非常容易造成命名冲突(以模块名作前缀、后缀),所以C++中选择把全局作用域进行拆分成 子作用域进行管理,这些子作用域就是作名字空间。 如何设计名字空间 namespace 空间名 {// 子作用域在该作用域中定义全局变量、函数、结构、联合、枚举、枚举值...,不

大话C++:第6篇 命名空间namespace作用域

1 命名空间概述 在一个大型的软件项目中,可能会有许多不同的代码文件,这些文件可能由不同的开发者编写,或者来自不同的库和模块。如果这些代码文件中存在同名的变量、函数、类或其他标识符,那么在编译或运行时就可能发生命名冲突,导致程序无法正确执行。 通过使用命名空间(namespace),开发者可以将相关的代码、变量、函数等组织在一起,形成一个独立的命名空间。这样,即使不同的代码片段中使用了相同的标