[AIGC] 图论基础入门

Graph Theory

图论是数学的一个分支,旨在研究图(graph)的属性和应用。这是一个跨学科领域,因为图论可以用于描述和解决各种实际问题。如社交网络分析,电脑网络,生物网络等。


文章目录

    • 什么是图?
    • 图的基本性质
    • LeetCode 图论相关问题解析及Python代码实现
    • LeetCode 题目:207. 课程表
      • 解题思路:
      • Python 代码实现:

什么是图?

图是由点(称为节点或顶点)和线(称为边)组成的。这些点和线可能代表现实生活中的某些对象或实体,边表示这些对象之间的某种关系。

基本上,有两种类型的图:

  1. 无向图:边没有方向。如果存在一条连接节点 A 和节点 B 的边,那么我们可以说 A 是 B 的邻居,反之亦然。

    eg. A – B

  2. 有向图:边有方向。如果存在一条从节点 A 指向节点 B 的边,那么我们只能说 B 是 A 的邻居,但不能说 A 是 B 的邻居。

    eg. A --> B

注意:在无向图中,边 (A,B)(B,A) 是相同的。但在有向图中,A->BB->A 代表两个不同的边。

图的基本性质

现在我们已经了解了图是什么,那么我们就可以进一步讨论图论的一些基本性质和术语了。

  1. 度(Degree):一个节点的度是其相邻节点的数量。在有向图中,我们区分入度(indegree)和出度(outdegree),分别表示指向节点和从节点指出的边的数量。

  2. 路径(Path):在图中,一条路径是一个节点序列,其中每个节点都通过边与下一个节点相连。

  3. 循环(Cycle):循环是一条路径的特殊类型,其中第一个节点和最后一个节点是同一节点。

  4. 连通性(Connectivity):在无向图中,如果从任何节点可以到达任何其他节点,那么图是连通的。在有向图中,这称为强连通性。

  5. 子图(Subgraph):子图是原图的一部分,包含原图的一些节点和边。树(Tree)就是一种没有环的连通无向图。

LeetCode 图论相关问题解析及Python代码实现

接下来,我们将讨论一些LeetCode上的图论相关问题,并提供Python代码及解题思路。

(注意:以下题目仅作为图论入门阶段的学习,可能不涵盖图论所有范围和技巧)

好的,我已经为您找到了一些具有图论问题的 LeetCode 代码解决方案。其中一些最受欢迎和全面的资源包括:

  1. coding-interview-gym by partho-maple

    • ⭐星数: 832
    • 💬描述: leetcode.com,algoexpert.io solutions in python and swift
    • 主要语言: Python
  2. leetcode by hongbo-miao

    • ⭐星数: 197
    • 💬描述: LeetCode solutions
    • 主要语言: Python
  3. Algorithms by kumailn

    • ⭐星数: 55
    • 💬描述: ✨ a bunch of algorithms in a bunch of languages ✨
    • 主要语言: Python

以上代码库大多专注于 LeetCode 的问题解决,并涉及诸多热门语言解决方案。虽然这些代码库提供了许多问题的解决方案,但每个问题的详细解析或讨论可能因代码库而异。建议在查看这些资源时,重点理解代码逻辑并尝试自己解决这些问题以提升技能。

如果您需要了解关于特定问题的更多信息,我建议访问 LeetCode的图论问题页面 , 这将提供大量有关图论问题的详细信息。

LeetCode 题目:207. 课程表

这是一道比较经典的图论问题。问题介绍如下:

现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些前置课程,例如想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们之间这种前置课程关系:[0,1]。

给定课程总量以及它们的前置课程,判断是否可能完成所有课程的学习?

解题思路:

我们要找的是课程间的依赖关系,这个关系其实就是一个有向图。我们可以使用拓扑排序来解决这个问题。一个有向图如果没有环,那么一定存在拓扑排序。

我们首先遍历所有的边,计算每门课程的入度(前置课程数量)。每次选择一个入度为0的课程,将它的所有后继课程的入度减1,直到所有的课程的入度都为0。如果还有课程的入度不为0,那么说明图中存在环,也就不能完成所有课程的学习。

Python 代码实现:


def canFinish(numCourses: int, prerequisites: list[list[int]]) -> bool:
    from collections import deque
    # 入度表
    indegrees = [0 for _ in range(numCourses)]
    # 邻接表
    adjacency = [[] for _ in range(numCourses)]
    # 队列
    queue = deque()
    # 通过 prerequisites 得到入度表和邻接表
    for cur, pre in prerequisites:
        indegrees[cur] += 1
        adjacency[pre].append(cur)
    # 将所有入度为 0 的节点入队
    for i in range(len(indegrees)):
        if not indegrees[i]: queue.append(i)
    
    # BFS 拓扑
	  while queue:
	      pre = queue.popleft()
	      numCourses -= 1
	      for cur in adjacency[pre]:
	          # 将后继课程的入度 -1
	          indegrees[cur] -= 1
	          # 如果后继课程入度为 0,那么将其加入到队列中
	          if not indegrees[cur]: queue.append(cur)
	
	  # 如果所有的课程都已经学完,那么说明可以完成课程学习,否则就不能
	  return not numCourses

这是运用了图论中的拓扑排序的技术来解决这个问题的。

以上便是对于 LeetCode 207.课程表 这个题目的解题思路及其 Python 代码实现,希望对你有所帮助。如果需要更多的帮助或者有其他的问题,欢迎随时告诉我。

我希望这些信息对您有所帮助!如果您有其他问题或需要更深入的解析,请告诉我!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE3版本新特性

VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…

Raylib的贪吃蛇

配置Raylib库 工具链主函数模板Draw: 绘制网格Snake: 初始化Draw:绘制蛇与果Input:移动Logic:游戏主要逻辑Draw: 游戏结束 工具链 mkdir snake cd snakeCMakeLists.txt cmake_minimum_required(VERSION 3.10) project(snake) set(CMAKE_EXP…

TWM论文阅读笔记

这是ICLR2023的一篇world model论文,用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model(不同于以往的如transdreamer的world model,本文的transformer-based world model在inference 的时候可以丢掉…

适用于世界上最先进的医疗应用的高压电阻器

我们的电阻器专为用于医疗诊断、治疗和预防的各种产品而设计。从小型植入式和非侵入性设备到大型诊断成像设备,医疗制造商之所以选择 EAK电阻器,是因为操作环境是高电压和磁场,准确性和稳定性至关重要。 EAK 专有的精密打印技术生产出非常适…

Python自动化(1)——获取窗口句柄

Python自动化(1)——获取窗口句柄 前言 在现代生活中,人们的工作往往有很大的重复性。可能一个工作,会有90%的相似性,这时候,就会思考能否通过程序来代替人工。 Python作为近几年来大火的编程语言,其便捷性和高效性&a…

大模型基础——从零实现一个Transformer(5)

大模型基础——从零实现一个Transformer(1)-CSDN博客 大模型基础——从零实现一个Transformer(2)-CSDN博客 大模型基础——从零实现一个Transformer(3)-CSDN博客 大模型基础——从零实现一个Transformer(4)-CSDN博客 一、前言 上一篇文章已经把Encoder模块和Decoder模块都已…

vue标签组

先看样式 再看代码 <div v-else class"relative"><n-tabs ref"tabsInstRef" v-model:value"selectValue" class"min-w-3xl myTabs"><n-tab-panev-for"(tab) in songsTags" :key"tab.name" displ…

【数据结构初阶】--- 堆

文章目录 一、什么是堆&#xff1f;树二叉树完全二叉树堆的分类堆的实现方法 二、堆的操作堆的定义初始化插入数据&#xff08;包含向上调整详细讲解&#xff09;向上调整删除堆顶元素&#xff08;包含向下调整详细讲解&#xff09;向下调整返回堆顶元素判断堆是否为空销毁 三、…

Docker安装(内网无网环境),亲测简单易懂

文章目录 前言一、安装环境二、安装步骤三、启动四、查看状态总结 前言 Docker安装&#xff08;内网无网环境&#xff09;&#xff0c;亲测简单易懂 一、安装环境 CentOS Linux release 7.x Docker版本&#xff1a;18.09.8 二、安装步骤 &#xff01;&#xff01;&#xf…

网络学习(三)TCP三次握手、四次挥手,及Wireshark抓包验证

目录 一、什么是 TCP 三次握手&#xff1f;二、什么是 TCP 四次挥手&#xff1f;三、Wireshark抓包验证3.1 如何捕获三次握手、四次挥手3.2 TCP 三次握手的记录3.3 数据传输3.4 TCP 四次挥手的记录 一、什么是 TCP 三次握手&#xff1f; TCP&#xff08;Transmission Control …

计算机组成原理之存储器(二)

文章目录 随机读写存储器RAM静态MOS存储单元与存储芯片动态MOS存储单元与存储芯片 半导体存储器逻辑设计存储器的读写以及刷新存储器的读写动态存储芯片的刷新 随机读写存储器RAM 静态MOS存储单元与存储芯片 静态RAM用半导体管的导通和截止来记忆&#xff0c;只要不掉电&#x…

2.线性神经网络

目录 1.线性回归一个简化模型线性模型&#xff1a;可以看做是单层神经网络衡量预估质量训练数据参数学习显示解总结 2.基础优化方法小批量随机梯度下降总结 3.Softmax回归&#xff1a;其实是一个分类问题回归VS分类从回归到多类分类---均方损失Softmax和交叉熵损失 4.损失函数L…

使用插件永久解决IDEA使用Shift+F10失效问题(不需要换老版本输入法)

在日常编程中&#xff0c;使用快捷键可以大大提高开发效率。然而&#xff0c;有时候我们会遇到IDEA 中&#xff0c;ShiftF10 快捷键失效。这个蛋疼的问题现在终于可以得到解决&#xff0c;上个月在逛V2EX的时候看见一位大佬做的插件。 大佬链接&#xff1a;https://www.v2ex.c…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 02:设计并使用断言

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

51单片机宏定义的例子

代码 demo.c #include "hardware.h"void delay() {volatile unsigned int n;for(n 0; n < 50000; n); }int main(void) {IO_init();while(1){PINSET(LED);delay();PINCLR(LED);delay();}return 0; }cfg.h #ifndef _CFG_H_ #define _CFG_H_// #define F_CPU …

nacos注册中心配置中心集群搭建

文章目录 学习连接1.Nacos安装与简单使用1.1. Nacos安装指南Windows安装下载安装包解压端口配置启动访问 Linux安装安装JDK上传安装包解压端口配置启动 1.2.服务注册到nacos使用步骤引入依赖配置nacos地址重启 示例父工程pom.xmluser-servicepom.xmlapplication.ymlUserApplica…

Jupyter Notebook 中 %run 魔法命令

目录 基本用法运行 Python 脚本运行 Jupyter Notebook 的其他单元格传递命令行参数 示例运行 Python 脚本示例运行其他 Jupyter Notebook 示例传递命令行参数示例 注意事项与 import 命令的区别%runimport 结论 %run 是 Jupyter Notebook 中的一个强大工具&#xff0c;它允许你…

【机器学习】第4章 决策树算法(重点)

一、概念 1.原理看图&#xff0c;非常简单&#xff1a; &#xff08;1&#xff09;蓝的是节点&#xff0c;白的是分支&#xff08;条件&#xff0c;或者说是特征&#xff0c;属性&#xff0c;也可以直接写线上&#xff0c;看题目有没有要求&#xff09;&#xff0c; &#xff0…

MySQL----InooDB行级锁、间隙锁

行级锁 行锁&#xff0c;也称为记录锁&#xff0c;顾名思义就是在记录上加的锁。 注意&#xff1a; InnoDB行锁是通过给索引上的索引项加锁来实现的&#xff0c;而不是给表的行记录加锁实现的&#xff0c;这就意味着只有通过索引条件检索数据&#xff0c;InnoDB才使用行级锁…

【开发工具】git服务器端安装部署+客户端配置

自己安装一个轻量级的git服务端&#xff0c;仅仅作为代码维护&#xff0c;尤其适合个人代码管理。毕竟代码的版本管理是很有必要的。 这里把git服务端部署在centos系统里&#xff0c;部署完成后可以通过命令行推拉代码&#xff0c;进行版本和用户管理。 一、服务端安装配置 …