
数据结构
xbb052
c++大学生
展开
-
城市通电(prim算法)
注意,任意两个城市之间最多只需要搭建一根电线,也就是说,对于每个 (a,b),不要有多余的 (a,b) 或 (b,a) 输出。本题要将所有城市连接起来,两种方式,一是直接连接发电站,花费为c[i],二是连接一个城市,该城市已经直接连接或者间接连接发电站。第三行输出 v 个整数,表示建立发电站的城市编号,注意输出编号要在范围 [1,n]内。一个城市如果建有发电站,或者通过电线直接或间接的与建有发电站的城市保持连通,则该城市通电。请问,如何合理设计通电方案,可以使得所有城市都成功通电,且花费最少?原创 2023-03-08 15:03:52 · 645 阅读 · 0 评论 -
作物杂交(spfa()算法)
输入的第 1 行包含 4 个整数 N,M,K,T,N 表示作物种类总数 (编号 1 至 N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示目标种子的编号。第 4 至 K+3 行,每行包含 3 个整数 A,B,C,表示第 A类作物和第 B 类作物杂交可以获得第 C� 类作物的种子。第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种子。第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种子。原创 2023-03-07 23:35:52 · 472 阅读 · 0 评论 -
acwing1562 微博转发(宽搜)
当用户在微博上发布帖子时,他/她的所有关注者都可以查看并转发他/她的帖子,然后这些人的关注者可以对内容再次转发…最后一行首先包含一个整数 K,表示询问次数,然后包含 K 个用户编号,表示询问这些人的帖子的最大可能转发量。如果 B 是 A 的关注者,C 是 B 的关注者,那么 A 的第一层关注者是 B,第二层关注者是 C。现在给定一个社交网络,假设只考虑 L 层关注者,请你计算某些用户的帖子的最大可能转发量。第一行包含两个整数,N 表示用户数量,L 表示需要考虑的关注者的层数。是第 i 名用户关注的总人数,原创 2023-02-28 19:57:34 · 565 阅读 · 0 评论 -
滑雪(记忆化搜索)
在给定矩阵中,最长的滑行轨迹为 25−24−23−…−3−2−125−24−23−…现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。在给定矩阵中,一条可行的滑行轨迹为 24−17−2−124−17−2−1。给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。原创 2023-02-27 14:15:53 · 134 阅读 · 0 评论 -
二分图的最大匹配(匈牙利算法)
如果该点找到的右半部分的点已经匹配成功,则就看该右半部分的这个点 已经匹配成功的左半部分的 这个点,是否可以为它重新匹配,寻找下家。二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。接下来 m 行,每行包含两个整数 u 和 v,表示左半部点集中的点 u 和右半部点集中的点 v 之间存在一条边。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。请你求出二分图的最大匹配数。原创 2023-02-19 20:55:41 · 186 阅读 · 0 评论 -
染色法判定二分图
接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。用自定义dfs()进行染色,定义一旦返回结果为false证明存在矛盾。给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。第一行包含两个整数 n 和 m。请你判断这个图是否是二分图。如果给定图是二分图,则输出。原创 2023-02-19 19:48:09 · 66 阅读 · 0 评论 -
kruskal算法求最小生成树(并查集)
由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出。给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出。原创 2023-02-18 15:37:11 · 154 阅读 · 0 评论 -
prim算法求最小生成树 858acwing
由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。接下来 m 行,每行包含三个整数 u,v,w,表示点 u 和点 v 之间存在一条权值为 w 的边。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出。最近的点,计算到 集合 的最短距离。原创 2023-02-18 00:06:26 · 89 阅读 · 0 评论 -
floyd算法 求最短路acwing854
再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。接下来 k 行,每行包含两个整数 x,y,表示询问点 x 到点 y 的最短距离。给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。共 k 行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出。数据保证图中不存在负权回路。该类算法原理是动态规划。原创 2023-02-17 21:34:33 · 99 阅读 · 0 评论 -
spfa()判断负环 acwing.852
类似与spfa()求最短路,只需在原基础上稍微改动,增加一个cnt数组,存储当前到现在的点的边数,若果存在负环,那原来的dist距离数组在该点位会不断更新,这时候cnt数组更新时每次多1;接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。不同的是,开始不能只将1号点位放入数组,因为一号点可能到不了负环上面的点,所以要将所有点位放入队列。给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,详细见代码,以邻接表的方式存储,用队列来更新每个点位。原创 2023-02-17 20:51:31 · 57 阅读 · 0 评论 -
牛客.送外卖题解(深度优先搜索)
来源:牛客网n 个小区排成一列,编号为从 0 到 n-1。一开始,美团外卖员在第0号小区,目标为位于第 n-1 个小区的配送站。给定两个整数数列 a[0]~a[n-1] 和 b[0]~b[n-1] ,在每个小区 i 里你有两种选择:1) 选择a:向前 a[i] 个小区。2) 选择b:向前 b[i] 个小区。把每步的选择写成一个关于字符 ‘a’ 和 ‘b’ 的字符串。求到达小区n-1的方案中,字典序最小的字符串。如果做出某个选择时,你跳出了这n个小区的范围,则这个选择不合法。原创 2023-02-17 17:04:40 · 179 阅读 · 0 评论 -
spfa算法 acwing851.spfa求最短路
接下来 m 行每行包含三个整数 x,y,z表示存在一条从点 x 到点 y 的有向边,边长为 z。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出。给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,类似于dijkstra()算法,每次更新该点的每一条出边。输出一个整数,表示 11 号点到 n� 号点的最短距离。图中涉及边长绝对值均不超过 10000。第一行包含整数 n 和 m。数据保证不存在负权回路。如果路径不存在,则输出。同样是邻接表的存储方式。原创 2023-02-16 23:41:51 · 114 阅读 · 0 评论 -
bellman_ford算法 由边数限制的最短路
以及要考虑到返回的数据值,如果dist【n】数据已被更新,返回d【n】,未被更新返回-1或者其他值来判断输出情况,要考虑最后d【n】被更新时恰好等于 判断未被更新的返回值的情况。防止发生串联的情况,例如1-2-3这是一条路径,边数限制k=1时,不备份的话我们可能先将dist【2】的数值更新,再用该数值将dist【3】给更新了。请你求出从 1 号点到 n号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出。输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。原创 2023-02-16 20:00:11 · 86 阅读 · 0 评论 -
dijkstra求最短路(堆优化版本)
用优先队列模拟堆,并且是小根堆,先将已知的一号点和距离放入小根堆,每次取出堆顶,作为起点,寻找该点的出边也就是距离该点最近的点,判断 如果dist【j】>现在的distance+t到该点的边长权值,用取出的堆顶元素更新距离。堆优化版其实就是存储结构不同,这里因为是稀疏图,用邻接表的方式存储,相对于普通的邻接表母版,存储时多一个边长的权值就可以。请你求出 1号点到 n 号点的最短距离,如果无法从 1 号点走到 n号点,则输出 −1。输出一个整数,表示 1 号点到 n 号点的最短距离。看看代码,有注释详解。原创 2023-02-16 19:15:08 · 176 阅读 · 0 评论 -
朴素版dijkstra算法(acwing 849求最短路)
接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z�。请你求出 1号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。给定一个 n个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。类似贪心,每次取不在路径中的最近的点,判断将其放入是否可以更新最短距离。输出一个整数,表示 1 号点到 n� 号点的最短距离。图中涉及边长均不超过10000。如果路径不存在,则输出 −1。第一行包含整数 n 和 m。原创 2023-02-16 00:04:53 · 99 阅读 · 0 评论 -
acwing848 有向图的拓扑排序(图论)
若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。首先思考,如果无环图即满足拓扑排序,是否可以将该节点的所有 出边 删去,结果使得每个节点的入度是0,满足入度是0,则将其存储起来。接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y的有向边 (x,y)。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。原创 2023-02-15 22:01:06 · 84 阅读 · 0 评论 -
acwing847.图中点的层次( 宽度优先搜索,图论 )
接下来 m� 行,每行包含两个整数 a和 b,表示存在一条从 a 走到 b 的长度为 1 的边。请你求出 1号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。给定一个 n个点 m 条边的有向图,图中可能存在重边和自环。输出一个整数,表示 11 号点到 n 号点的最短距离。所有边的长度都是 1,点的编号为 1∼n。同样是宽度优先搜索,看代码,注释有详解。第一行包含两个整数 n 和 m。原创 2023-02-15 21:00:01 · 98 阅读 · 0 评论 -
acwing845.八数码(宽搜bfs(),队列)
现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。在一个 3×3 的网格中,1∼8 这 8 个数字和一个。与其上、下、左、右四个方向之一的数字交换(如果存在)。先后与右、下、右三个方向的数字交换成功得到正确排列。恰好不重不漏地分布在这 3×3 的网格中。输入占一行,将 3×3 的初始网格描绘出来。输出占一行,包含一个整数,表示最少交换次数。如果不存在解决方案,则输出 −1−1。同样是宽度优先搜索,用队列解决。例如,示例中图形就可以通过让。在游戏过程中,可以把。代码如下,注释有详解。原创 2023-02-15 20:22:08 · 91 阅读 · 0 评论 -
acwing844.走迷宫
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 00 或 11,其中 00 表示可以走的路,11 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。数据保证 (1,1)处和 (n,m) 处的数字为 00,且一定至少存在一条通路。接下来 n� 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。第一行包含两个整数 n 和 m。原创 2023-02-15 20:02:40 · 129 阅读 · 0 评论 -
acwing846.树的重心(数据结构,树,深度优先搜索)
重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。第一行包含整数 n,表示树的结点数。原创 2023-02-15 19:53:46 · 88 阅读 · 0 评论