Python无向图--邻接列表转为邻接矩阵表示

这段代码实现了一个简单的社交网络类 SocialNetwork,并提供了一些基本操作,如添加用户、用户之间的关注关系、获取关注者和正在关注的用户等功能

总的来说,这段代码实现了一个简单的社交网络,提供了基本的用户管理和关系建立功能,并且能够将社交网络表示为无向图的邻接矩阵

以下是对代码的简单总结归纳:

  1. SocialNetwork 类

    • 初始化方法 __init__() 创建了一个空的邻接表 adj_list,用于存储用户之间的关系。
  2. add_user() 方法

    • 添加一个新用户到社交网络中,如果用户不存在的话。
  3. follow() 方法

    • 用户之间的关注关系,添加用户之间的双向关注关系。
  4. get_followers() 方法

    • 获取关注指定用户的所有用户。
  5. get_following() 方法

    • 获取一个用户正在关注的所有用户。
  6. to_adj_matrix() 方法

    • 将社交网络转换为无向图的邻接矩阵表示。
  7. 使用示例

    • 创建了一个 SocialNetwork 对象 net,添加了几个用户并建立了关注关系。
    • 打印了指定用户的关注者和被关注者。
    • 打印了社交网络的邻接矩阵表示。
class SocialNetwork:def __init__(self):self.adj_list = {}  # 使用字典来实现邻接表def add_user(self, user):"""添加一个新用户,如果用户不存在的话"""if user not in self.adj_list:self.adj_list[user] = []def follow(self, user1, user2):"""用户1关注用户2"""if user1 in self.adj_list and user2 in self.adj_list:self.adj_list[user1].append(user2)self.adj_list[user2].append(user1)  # 无向图,需要同时添加双向关系else:print(f"Make sure both {user1} and {user2} are in the network")def get_followers(self, user):"""获取关注指定用户的所有用户"""followers = [u for u, v in self.adj_list.items() if user in v]return followersdef get_following(self, user):"""获取一个用户正在关注的所有用户"""if user in self.adj_list:return self.adj_list[user]else:return []def to_adj_matrix(self):"""将社交网络转换为无向图的邻接矩阵表示"""users = list(self.adj_list.keys())n = len(users)adj_matrix = [[0] * n for _ in range(n)]  # 初始化邻接矩阵for i in range(n):for j in range(n):if users[j] in self.adj_list[users[i]]:adj_matrix[i][j] = 1return adj_matrix# 使用
net = SocialNetwork()
net.add_user("Alice")
net.add_user("Bob")
net.add_user("Charlie")net.follow("Alice", "Bob")
net.follow("Alice", "Charlie")
net.follow("Bob", "Charlie")print("Alice is following:", net.get_following("Alice"))
print("Charlie is followed by:", net.get_followers("Charlie"))print("\n无向图的邻接矩阵表示:")
adj_matrix = net.to_adj_matrix()
for row in adj_matrix:print(row)

Alice is following: ['Bob', 'Charlie']
Charlie is followed by: ['Alice', 'Bob']

无向图的邻接矩阵表示:
[0, 1, 1]
[1, 0, 1]
[1, 1, 0]
[Finished in 562ms]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何基于Spring Boot项目从零开始打造一个基于数据库号段模式去中心化的分布式ID生成方案

一、前言 在当前系统开发过程中,单体架构的应用正在走向消亡,越来越多的应用开始分布式架构,在分布式架构设计过程中,有一个问题往往避免不了,就是分布式ID生成问题。 在常见解决方案中,有使用雪花算法或…

K8S探针分享

一,探针介绍 1 探针类型 livenessProbe:存活探针,用于判断容器是不是健康;如果探测失败,Kubernetes就会重启容器。 readinessProbe:就绪探针,用于判断是否可以将容器加入到Service负载均衡池…

Access2019直接将数据导入SQL Server数据库中,再直接链接回来

Access2019 的数据表等,除了通过 SSMA 导入数据库外,还可以利用access2019 自身的外部数据导出功能来达到目的。本文将详细介绍这一操作过程。 一、命令行操作阶段 1.以SA这一超级用户登录SQL Server,创建一个数据库,例如“个人…

网络安全培训对软件开发人员的重要性

微信搜索关注:网络研究观 阅读获取更多信息。 组织所经历的持续不断的网络威胁没有任何放缓的迹象,使得实现有效安全的任务变得越来越具有挑战性。 根据最新的 Verizon 数据泄露调查报告,2023 年高级攻击增加了 200% 以上。 IBM 数据泄露成…

阻塞IO下的echo实验

代码分析 echo代码位置:recipes-master/tpc/echo.cc echo_client.cc 服务端代码 int main(int argc, char* argv[]) {InetAddress listenAddr(3007);Acceptor acceptor(listenAddr);printf("Accepting... Ctrl-C to exit\n");int count 0;bool nodelay…

解释JDK、JRE和JVM的区别

JDK、JRE和JVM是Java编程语言中非常重要的三个组成部分,它们协同工作,使得Java程序能够在各种不同的平台上执行。下面详细解释这三者: JVM(Java Virtual Machine) JVM是Java虚拟机的缩写,它是一个虚拟的计…

Elasticsearch知识点表格总结

最近其实有点忙,在主攻Django项目和go语言项目,所以只能利用下班晚上和周末总结一些知识点,因为最近的公司的项目没有用上Elasticsearch,所以总结一下,方便以后复习,以及以后面试会用上,不然过段…

C# WinForm —— 09 标签、文本框、按钮控件

标签 Label 一般显示不能编辑的文本或图像 常用属性、事件: 属性用途(Name)标签对象的ID,在代码里引用标签的时候会用到,一般以 lbl 开头Text设置或获取 界面上显示的 文本信息Image显示图像ImageList图像集,通常和 ListView ToolStrip Tre…

【Linux网络编程】数据链路层

数据链路层 1.以太网帧格式2.重谈局域网转发的原理(基于协议)3.认识MTU3.1MTU对IP协议的影响3.2MTU对UDP协议的影响3.3MTU对于TCP协议的影响 4.ARP协议 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励…

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),简单绘图工具制作

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

【深度学习(1)】研0和研1如何上手深度学习及定方向

深度学习(1) 基础部分书籍鱼书 (理论部分) 视频课程我是土堆(代码部分) 提升部分李沐的动手学深度学习李沐老师的书 定方向网站: paperwithcode谷歌学术找论文 基础部分 书籍 鱼书 (理论部分) 适合入门,…

11.JAVAEE之网络原理1

1.应用层(和程序员接触最密切) 应用程序 在应用层这里,很多时候, 都是程序员"自定义"应用层协议的,(当然,也是有一些现成的应用层协议)(这里的自定义协议,其实是非常简单的~~协议 >约定,程序员在代码中规定好,数据如何进行传输) 1.根据需求, 明确要传…

XTuner微调LLM:1.8B、多模态和Agent-笔记四

本次课程由XTuner 贡献者李剑锋、汪周谦、王群老师讲解【XTuner 微调 LLM:1.8B、多模态和 Agent】课程 课程视频:http:// https://b23.tv/QUhT6ni 课程文档:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 两种Finetun…

目标检测的mAP、PR指标含义

基本概念 什么是一个任务的度量标准。对于目标检测任务来说,它的首要目标是确定目标的位置并判别出目标类别。这里已医学图像为例,我们需要计算出血液红细胞(RBC)、白细胞(WBC)和血小板的数量。为了实现这一…

【网络安全】HTTP协议 — 基础

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 学习目标​ 一、万维网的诞生与发展​编辑 1.万维网的诞生与发展 2.HTTP协议诞生与发展 二、网络基础 1.TCP/IP分层传输 1)TCP/IP协议 2)封装与拆封 …

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改(因为没有使用nodef )编译通过 修改报告描述符(默认的描述符无法传输数据) 参考:USB协议详解第10讲(USB描…

Xinlinx FPGA内的存储器BRAM全解

目录 一、总体概述1.7系列FPGA的BRAM特点2.资源情况 二、BRAM分类1.单端口RAM2.简单双端口RAM3.真双端口RAM 三、BRAM的读写1、Primitives Output Registers读操作注意事项2.三种写数据模式(1)Write_First(2)Read_First&#xff0…

Windows如何安装spark

Apache Spark是一个开源的大数据处理框架,旨在提供高效、通用和易用的大数据处理引擎。它最初由加州大学伯克利分校AMPLab开发,并于2010年开源。 Spark提供了一个基于内存的计算引擎,可以在大规模数据集上执行高速的数据处理任务。相比传统的…

pytest-stress:好用的pytest压力测试插件

简介:pytest-stress允许在用户定义的时间内循环测试。特别适用于一些已知测试时间,但不知道运行次数的场景。 历史攻略: 压力测试工具:Stress详解 Python:超过设定的时长则退出 安装: pip3 install py…

PC40与PC95磁芯的区别

磁芯pc95和pc40的差别在于PC95磁芯Pcv降低5%磁导率随温度变化小于PC40,利于谐振低温特性好,用在电源产品中低温效率高。另外就是PC95价格高。 PC是TDK公司对磁芯材料的命名, 类似有PC40,PC44,PC95,数字越大价格越高&am…