图论
文章平均质量分 53
DarkFlameMaster2188
这个作者很懒,什么都没留下…
展开
-
97. 小明逛公园(Floyd 算法)
从递推公式:grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1]) 可以看出,我们需要三个for循环,分别遍历i,j 和k。即: grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])对于第一种情况,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1]原创 2024-07-09 17:48:20 · 536 阅读 · 0 评论 -
96. 城市间货物运输 III(bellman_ford之单源有限最短路)
而且对所有边的后面几次松弛,同样是更新了所有的节点,说明 至多经过k 个节点 这个限制 根本没有限制住,每个节点的数值都被更新了。输出描述:输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 “unreachable”,表示不存在符合条件的运输方案。注意题目中描述是 最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径。下,从城市 src 到城市 dst 的最低运输成本。原创 2024-07-09 16:12:00 · 249 阅读 · 0 评论 -
95. 城市间货物运输 II(bellman_ford之判断负权回路)
题目描述:共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。然而,在评估从城市 1 到城市 n 的所有可能路径中综合政府补贴后的最低运输成本时,存在一种情况:图中可能出现负权回路。负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。输出描述:如果没有发现负权回路,则输出一个整数,表示从城市 1 到城市 n 的最低运输成本(包括政府补贴)。原创 2024-07-09 15:23:52 · 214 阅读 · 0 评论 -
94. 城市间货物运输 I(Bellman_ford 队列优化算法(又名SPFA))
本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点5)。而松弛 边(节点4->节点6) ,边(节点5->节点3)等等 都是无效的操作,因为 节点4 和 节点 5 都是没有被计算过的节点。Bellman_ford 算法每次松弛 都是对所有边进行松弛。但真正有效的松弛,是基于已经计算过的节点在做的松弛。由于是对边进行操作,所以使用邻接表对图进行存储较好。所以 Bellman_ford 算法。原创 2024-07-09 12:10:00 · 218 阅读 · 0 评论 -
94. 城市间货物运输 I(Bellman_ford 算法)
也就是说,**如果 通过 A 到 B 这条边可以获得更短的到达B节点的路径,即如果 minDist[B] > minDist[A] + value,那么我们就更新 minDist[B] = minDist[A] + value ,这个过程就叫做 “松弛”。状态二: minDist[B]本身就有权值(可能是其他边链接的节点B例如节点C,以至于 minDist[B]记录了其他边到minDist[B]的权值)题目描述:共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市。原创 2024-07-08 17:14:40 · 294 阅读 · 0 评论 -
47. 参加科学大会(dijkstra(堆优化版))
当 n 很大,边的数量也很多的时候(稠密图),从点的角度来计算最小生成树。但 n 很大,边的数量很小的时候(稀疏图),可以换成从边的角度来求最短路。原创 2024-07-08 16:04:17 · 166 阅读 · 0 评论 -
47. 参加科学大会(dijkstra算法)
题目描述:小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。本题就是求最短路,最短路是图论中的经典问题即:给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。输出描述:输出一个整数,代表小明从起点到终点所花费的最小时间。minDist数组 用来记录。原创 2024-07-08 15:06:21 · 304 阅读 · 0 评论 -
117. 软件构建(拓扑排序)
题目描述:某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。我们做拓扑排序的时候,应该优先找 入度为 0 的节点,只有入度为0,它才是出发节点。拓扑排序的过程,其实就两步:1.输出描述:输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。原创 2024-07-08 10:14:02 · 120 阅读 · 0 评论 -
53.寻宝(最小生成树之kruskal算法)
题目描述:不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。输入描述:第一行包含两个整数V 和 E,V代表顶点数,E代表边数。接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。判断两个元素在不在同一个集合。prim 算法是维护节点的集合,而 Kruskal 是维护边的集合。–如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合。原创 2024-07-08 09:31:03 · 111 阅读 · 0 评论 -
53. 寻宝(最小生成树之prim算法)
题目描述:不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。输入描述:第一行包含两个整数V 和 E,V代表顶点数,E代表边数。顶点编号是从1到V。接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。原创 2024-07-07 17:48:27 · 107 阅读 · 0 评论 -
109. 冗余连接II
如下图:节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。原创 2024-07-07 15:41:45 · 405 阅读 · 0 评论 -
108. 冗余连接
题目描述:树可以看成是一个图(拥有 n 个节点和 n - 1 条边的连通无环无向图)。现给定一个拥有 n 个节点(节点标号是从 1 到 n)和 n 条边的连通无向图,请找出一条可以删除的边,删除后图可以变成一棵树。输入描述:第一行包含一个整数 N,表示图的节点个数和边的个数。题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。输出描述:输出一条可以删除的边。原创 2024-07-07 14:01:18 · 167 阅读 · 0 评论 -
105. 有向图的完全可达性
输入描述:第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。输出描述:输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。**并查集主要解决集合问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点。,函数:join(int u, int v),将两个节点连在同一个根节点上。,函数:find(int u),也就是判断这个节点的祖先节点是哪个。原创 2024-07-07 13:17:14 · 228 阅读 · 0 评论 -
110.字符串接龙
题目描述:字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列: (1)序列中第一个字符串是 beginStr。(4)转换过程中的中间字符串必须是字典 strList 中的字符串,且strList里的每个字符串只使用一次。给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。后续 N 行,每行一个字符串,代表 strList 中的字符串。原创 2024-07-05 16:54:49 · 323 阅读 · 0 评论 -
104. 建造最大岛屿
题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。岛屿面积的计算方式为组成岛屿的陆地的总数。本题有一种暴力解法,遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积,但时间复杂度太高,因为重复遍历了原本存在的岛屿。第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。原创 2024-07-05 15:56:13 · 181 阅读 · 0 评论 -
103. 水流问题
本题可以**从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。矩阵的左边界和上边界被认为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。输出描述:输出共有多行,每行输出两个整数,用一个空格隔开,表示可达第一组边界和第二组边界的单元格的坐标,输出顺序任意。本题和沉没孤岛有点相似,沉没孤岛问题是从边界出发,标记和边界相连的岛屿,然后把未标记的岛屿沉没。我们的目标是确定那些单元格,从这些单元格出发的水可以达到第一组边界和第二组边界。原创 2024-07-05 14:45:33 · 188 阅读 · 0 评论 -
102.沉没孤岛
依然是从地图周边出发,将周边空格相邻的陆地都做上标记,然后在遍历一遍地图,遇到 陆地 且没做过标记的,那么都是地图中间的 陆地 ,全部改成水域就行。题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。步骤一:深搜或者广搜将地图周边的 1 (陆地)全部改成 2 (特殊标记)步骤二:将水域中间 1 (陆地)全部改成 水域(0)原创 2024-07-05 11:04:02 · 194 阅读 · 0 评论 -
101.孤岛的总面积
题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0。然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。输出描述:输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。,岛屿面积的计算方式为组成岛屿的陆地的总数。原创 2024-07-05 10:02:52 · 150 阅读 · 0 评论 -
99. 岛屿数量
题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0。本题深度优先搜索和广度优先搜索对当前点的处理方式大致相同,主要使用模板不同,广度优先遍历需要使用队列。如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。输出描述:输出一个整数,表示岛屿的数量。原创 2024-07-04 22:24:31 · 237 阅读 · 0 评论 -
98. 所有可达路径(深度优先搜索)
题目描述:给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。输出描述:输出所有的可达路径,路径中所有节点之间空格隔开,每条路径独占一行,存在多条路径,路径输出的顺序可任意。1.走当前遍历节点x的下一个节点 2 .将选中的x所指向的节点,加入到单一路径来 3.进入下一层递归 4.回溯。后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径。当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。, 5后面没有空格!原创 2024-07-04 16:41:48 · 320 阅读 · 0 评论