图论
文章平均质量分 94
图论
闻缺陷则喜何志丹
本人拙作《喜缺全书算法册》欢迎指教,可在CSDN下载https://download.csdn.net/download/he_zhidan/88368465
展开
-
【图论】【拓扑排序】1857. 有向图中最大颜色值
给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 (下标从 0 开始)。同时给你一个二维数组 edges ,其中 edges[j] = [aj, bj] 表示从节点 aj 到节点 bj 有一条 有向边 。图中一条有效 路径 是一个点序列 x1 -> x2 -> x3 -> ... -> xk ,对于所有 1原创 2024-04-02 17:00:00 · 821 阅读 · 0 评论 -
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络,connections[i] = [a, b] 表示服务器 a 和 b 之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。关键连接 是在该集群中的重要连接,假如我们将它移除,便会导致某些服务器无法访问其他服务器。请你以任意顺序返回该集群内的所有 关键连接 。原创 2024-03-28 17:00:00 · 967 阅读 · 1 评论 -
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
魔物了占领若干据点,这些据点被若干条道路相连接,roads[i] = [x, y] 表示编号 x、y 的两个据点通过一条道路连接。现在勇者要将按照以下原则将这些据点逐一夺回:在开始的时候,勇者可以花费资源先夺回一些据点,初始夺回第 j 个据点所需消耗的资源数量为 cost[j]接下来,勇者在不消耗资源情况下,每次可以夺回一个和「已夺回据点」相连接的魔物据点,并对其进行夺回注:为了防止魔物暴动,勇者在每一次夺回据点后(包括花费资源夺回据点后),需要保证剩余的所有魔物据点之间是相连通的(不经过「已夺回据原创 2024-03-11 12:27:05 · 1257 阅读 · 12 评论 -
【分类讨论】【割点】1568. 使陆地分离的最少天数
给你一个大小为 m x n ,由若干 0 和 1 组成的二维网格 grid ,其中 1 表示陆地, 0 表示水。岛屿 由水平方向或竖直方向上相邻的 1 (陆地)连接形成。如果 恰好只有一座岛屿 ,则认为陆地是 连通的 ;否则,陆地就是 分离的 。一天内,可以将 任何单个 陆地单元(1)更改为水单元(0)。返回使陆地分离的最少天数。原创 2024-03-02 17:00:00 · 905 阅读 · 2 评论 -
【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目
给你一棵 n 个节点的 无向 树,节点编号为 0 到 n - 1 ,树的根节点在节点 0 处。同时给你一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。给你一个长度为 n 下标从 0 开始的整数数组 cost ,其中 cost[i] 是第 i 个节点的 开销 。你需要在树中每个节点都放置金币,在节点 i 处的金币数目计算方法如下:如果节点 i 对应的子树中的节点数目小于 3 ,那么放 1 个金币。否则,计算原创 2024-02-12 07:00:00 · 2761 阅读 · 49 评论 -
【二分查找】LeetCode1970:你能穿过矩阵的最后一天
给你一个下标从 1 开始的二进制矩阵,其中 0 表示陆地,1 表示水域。同时给你 row 和 col 分别表示矩阵中行和列的数目。一开始在第 0 天,整个 矩阵都是 陆地 。但每一天都会有一块新陆地被 水 淹没变成水域。给你一个下标从 1 开始的二维数组 cells ,其中 cells[i] = [ri, ci] 表示在第 i 天,第 ri 行 ci 列(下标都是从 1 开始)的陆地会变成 水域 (也就是 0 变成 1 )。你想知道从矩阵最 上面 一行走到最 下面 一行,且只经过陆地格子的 最后一天原创 2023-12-02 07:00:00 · 365 阅读 · 10 评论 -
C++双指针算法:1782统计点对的数目
给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目:a < bcnt 是与 a 或者 b 相连的边的数目,且 cnt 严格大于 queries[j] 。请你返回一个数组 answers ,其中 answers.length == queries.length 且 answer原创 2023-11-26 09:30:26 · 966 阅读 · 1 评论 -
C++算法:LCR 112矩阵中的最长递增路径
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。原创 2023-11-11 18:48:04 · 658 阅读 · 6 评论 -
时间复杂度O(40n*n)的C++算法:2699修改图中的边权
1.12.1. 题目给你一个 n 个节点的 无向带权连通 图,节点编号为 0 到 n - 1 ,再给你一个整数数组 edges ,其中 edges[i] = [ai, bi, wi] 表示节点 ai 和 bi 之间有一条边权为 wi 的边。部分边的边权为 -1(wi = -1),其他边的边权都为 正 数(wi > 0)。原创 2023-10-14 12:03:22 · 468 阅读 · 19 评论 -
C++算法:2608图中的最短环
现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶点。返回图中 最短 环的长度。如果不存在环,则返回 -1。环 是指以同一节点开始和结束,并且路径中的每条边仅使用一次。ui!= vi不存在重复的边。原创 2023-10-12 18:15:07 · 574 阅读 · 22 评论 -
C++算法:936利用拓扑排序解决戳印序列
如果先0处,再x处,则[0,x)处和印章前x个字符相同,[x,x+n)和印章完全相同。一,如果target[i,i+m)等于印章,假定结果系列包括x和i,且x小于i。”,而你的印章 stamp 是 “abc”,那么在第一回合,你可以得到 “abc?二,target[i1,i1+x)是印章的前缀,target[i1+x,i1+x+m)等于印章,Rec(i1+x+m)能覆盖。三,target[i1,i1+m)等于印章,target[i1+m,i1+m+x)是印章的后缀,Rec(i1+m+x)能覆盖。原创 2023-10-10 12:34:38 · 421 阅读 · 21 评论 -
C++算法:936戳印序列原理及实现二
,而你的印章 stamp 是 “abc”,那么在第一回合,你可以得到 “abc?例如,如果序列是 “ababc”,印章是 “abc”,那么我们就可以返回与操作 “?” -> “abc?在每个回合,你可以将印章放在序列上,并将序列中的每个字母替换为印章上的相应字母。另外,如果可以印出序列,那么需要保证可以在 10 * target.length 个回合内完成。如果可以印出序列,那么返回一个数组,该数组由每个回合中被印下的最左边字母的索引组成。如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。原创 2023-10-07 18:43:52 · 165 阅读 · 4 评论 -
C++算法:存在负权边的单源最短路径的原理和实现
如果有正权环和0权环,则拿掉这个环。如果负权环,则最小距离是无穷小。循环“点数-1”后,再循环一次,如果有点的最短距离变小,则一定有负权环;如果有负权环,则再循环一次,一定有点(任意负权环的负权边的终点)距离变短。假定此点是e,拿掉负权环上所有的边后,源点到e的最短路径为Path。不拿掉负权环,则e的最短路径为:Path+此负权环。循环k次,循环第i次时,m_vDis表示各点最多经过i-1条边的最短距离;vDis表示各点最多经过i条边的最短距离。但floyd无法处理负权环,最短距离是无穷小。原创 2023-10-05 00:30:00 · 740 阅读 · 18 评论 -
C++算法:多源最短路径的原理及实现
通过[0,i)中任意个点,i1到i2的最短路径记为PrePathi1i2,通过[0,i+1)中任意个点,i1到i2的距离的路径为Pathi1i2,如果Path不经过Pathi1i2,则和PrePathi1i2相同。m_vMat同时表示PreMath和Math,如果m_vMat[i1][i]或m_vMat[i][i2]已经更新,会带来错误的结果么?当一层循环执行完后,m_vMat[i1][i2]表示经过[0,i)中的任意个点的最短距离。//m_vMat[i1][i2] 表示通过[0,i]中转的最短距离。原创 2023-10-04 10:26:41 · 748 阅读 · 19 评论 -
C++算法:堆优化迪氏最短单源路径原理及实现
如果是有向图,则入队数量等于边数,计算出起点最短路径的那一轮。优先队列入队和出队时间复杂度都是O(logn),故总时间复杂度为O(nlogn)。优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。可以非连通,非连通的距离为-1。O(ElogE),E是边数。二,任意点的最短距离和可以直达的边。下表分析源点为0的处理过程。3到源点的最短距离是5。0到源点的最短距离为0。1到源点的最短距离为1。原创 2023-10-03 10:52:08 · 458 阅读 · 8 评论 -
C++算法2876:有向图访问计数的原理及实现
假定此区域的一条边为i0->edges[i0],edges[i0]简称为i1。如果没有环, 则edges[i1](简称为i2)也在此连通区域,edges[i2](简称i3)也在此连通区域,i4....。反证法:假定没有环,除源点外,还可以到达n个端点,共n+1个端点,与共有n个端点重复。给你一个下标从 0 开始的数组 edges ,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。你从节点 x 开始,通过边访问其他节点,直到你在 此过程 中再次访问到之前已经访问过的节点。原创 2023-10-01 20:30:33 · 420 阅读 · 8 评论 -
C++算法:朴素迪氏最短单源路径的原理及实现
Dijkstra算法,翻译为迪杰斯特拉或狄克斯特拉。在下驽钝,记不住如此长的翻译,故简称迪氏。原创 2023-09-30 21:30:26 · 379 阅读 · 5 评论 -
C++算法:01BFS最短距离的原理和实现
Edges0表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有路联接。Edges1表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有损坏的路连接。可能有环,但无自环,重边,可能不联通。可以用类似上章的思路,没损害的路加到pre中,损坏的路加到que中。需要维修的路入队的时候不能计算最短距离,因为不一定是最短边。改在入队计算最短距离,第一层循环记录最短距离。一种最短距离或两种最短距离。一种最短距离或两种最短距离。状态不变或变为一种最短距离。原创 2023-09-29 09:10:03 · 573 阅读 · 1 评论 -
C++BFS算法
本文介绍了BFS的原理和实现及例题。BFS中文名为广度优先或宽度优先。最经典的应用是图论,但不限于图论。O(m) ,m是边的数量。许多经典应用场景,如2D游戏地图、网格,出边固定不超过4或8(4联通或8联通),这种情况也可以说BFS的时间复杂度是O(n),n是端点数。每个端点只会访问一次,显然第一次访问的是最小距离,第二次访问时距离只会变大或不变,没有继续访问的意义。假定s到x2的最短最短距离经过x1,如果s到x1距离变大,x1到x2的距离不变,则s到x2的距离变大。原创 2023-09-28 12:18:32 · 1567 阅读 · 7 评论