06-图3 六度空间(C)

2024-08-20 20:20
文章标签 空间 06 六度

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

这个很好想,尤其是经过图的连通集,所以这一次我才有之前写的代码为主体以邻接表的方法构建了方法一,至于运用 邻接矩阵,可以查看我之前的图的连通集这一方案,稍微改装,便解决这一问题了。

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


图1 六度空间示意图

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

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

输入格式:

输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103,表示人数)、边数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%

 我的AC:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>typedef struct ENode *PtrToENode;
typedef PtrToENode Edge;
struct ENode{int V1, V2;int Weight;
};typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{int V;int Weight;PtrToAdjVNode Next;
};typedef struct VNode **AdjList;
struct VNode{PtrToAdjVNode FirstEdge;
};typedef struct GNode *PtrToGNode;
typedef PtrToGNode LGraph;
struct GNode{int Nv;int Ne;AdjList G;
};typedef struct Node *QNode;
struct Node{int Data;QNode Next;
};
typedef struct QNode *Queue;
struct QNode{QNode front;QNode rear;
};LGraph Build_Graph();
LGraph Init_Graph(int Nv, int Ne);
void Insert_Graph(LGraph M, Edge E);
void Sort_Graph(PtrToAdjVNode *Link);
void Visit(int Vertex);
int BFS(LGraph M, int Vertex,  bool *Visited);
void SDS(LGraph M);
Queue Init_Q();
void Add_Q(Queue Q, int Vertex);
int Delete_Q(Queue Q);
bool IsEmpty_Q(Queue Q);int main()
{LGraph M;M = Build_Graph();SDS(M);return 0;
}
LGraph Build_Graph()
{LGraph M;Edge E;int Nv, Ne;int i;scanf("%d%d", &Nv, &Ne);M = Init_Graph(Nv, Ne);E = (Edge)malloc(sizeof(struct ENode));if(M ->Nv){for(i = 1; i <= (M ->Ne); i++){scanf("%d%d", &E ->V1, &E ->V2);Insert_Graph(M, E);}}return M;
}
LGraph Init_Graph(int Nv, int Ne)
{LGraph M;M = (LGraph)malloc(sizeof(struct GNode));M ->Nv = Nv;M ->Ne = Ne;M ->G = (AdjList)malloc(sizeof(struct VNode) * Nv);for(int i = 0; i <= Nv; i++){M ->G[i] = (struct VNode*)malloc(sizeof(struct VNode));M ->G[i] ->FirstEdge = NULL;}return M;
}
void Insert_Graph(LGraph M, Edge E)
{// 无向图PtrToAdjVNode NewNode1, NewNode2;NewNode1 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode1 ->V = E ->V2;NewNode1 ->Weight = E ->Weight;NewNode1 ->Next = M ->G[E ->V1] ->FirstEdge;M ->G[E ->V1] ->FirstEdge = NewNode1;Sort_Graph(&(M ->G[E ->V1] ->FirstEdge));NewNode2 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode2 ->V = E ->V1;NewNode2 ->Weight = E ->Weight;NewNode2 ->Next = M ->G[E ->V2] ->FirstEdge;M ->G[E ->V2] ->FirstEdge = NewNode2;Sort_Graph(&(M ->G[E ->V2] ->FirstEdge));
}
void Sort_Graph(PtrToAdjVNode *Link)
{PtrToAdjVNode head, Temp, Key;head = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));head ->Next = (*Link) ->Next;Temp = head;Key = (*Link);Key ->Next = NULL;if(!(head ->Next)){return ;}while(head ->Next){if(Key ->V > (head ->Next ->V)){head = head ->Next;}else{Key ->Next = head ->Next;head ->Next = Key;break;}}if(!(head ->Next)){head ->Next = Key;}(*Link) = Temp ->Next;return ;
}int BFS(LGraph M, int Vertex,  bool *Visited)
{Queue Q;PtrToAdjVNode G;int V;int count = 1, level = 0, last = Vertex, tail;Q = Init_Q();Visited[Vertex] = true;Add_Q(Q, Vertex);while(!IsEmpty_Q(Q)){V = Delete_Q(Q);for(G = M ->G[V] ->FirstEdge; G; G = G ->Next){if(Visited[G ->V] == false){Visited[G ->V] = true;Add_Q(Q, G ->V);count++;tail = G ->V;}}if(V == last){level++;last = tail;}if(level == 6){break;}}return count;
}
Queue Init_Q()
{Queue Q;Q = (Queue)malloc(sizeof(struct QNode));Q ->front = NULL;Q ->rear = Q ->front;return Q;
}
void Add_Q(Queue Q, int Vertex)
{QNode Node;Node = (QNode)malloc(sizeof(struct Node));Node ->Data = Vertex;Node ->Next = NULL;if(!(Q ->front) && !(Q ->rear)){Q ->front = Node;Q ->rear = Node;}else{Q ->rear ->Next = Node;Q ->rear = Node;}
}
int Delete_Q(Queue Q)
{if(IsEmpty_Q(Q)){printf("很遗憾,是空的!\n");return -1;}else{QNode Temp;int Vertex;if(Q ->front == Q ->rear){Vertex = Q ->front ->Data;Q ->front = NULL;Q ->rear = NULL;}else{Temp = Q ->front;Q ->front = Q ->front ->Next;Vertex = Temp ->Data;free(Temp);}return Vertex;}
}
bool IsEmpty_Q(Queue Q)
{return Q ->front == NULL;
}
void SDS(LGraph M)
{bool *Visited;int count;Visited = (bool*)calloc(M ->Nv + 1, sizeof(bool));for(int V = 1; V <= M->Nv;V++) {count = BFS(M, V, Visited);printf("%d: %.2f%%\n", V, ((count * 100.0) / (M ->Nv)));for(int V = 1; V <= M->Nv;V++){Visited[V] = false;}}free(Visited);
}

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



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

相关文章

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

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

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

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

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之前,

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C++ 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽(Signals and Slots) 这里用到了C++类与对象的很多概念 1. 清华镜像源下载 https://

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

目录 一、数据结构前言 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