自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 AcWing 794. 高精度除法(高精度除低精度)

题意给定两个正整数,计算它们的商和余数。正整数长度的范围是1到100000。PS:除数不为0.分析1.这里是高精度除以低精度,使用的除法运算是我们人类熟悉的。2.从被除数的高位开始,每个数位都尝试去除以除数,一直到最低位。3.最后倒序输出商。代码高精度除低精度#include <iostream>using namespace std;const int N = 1e5 + 10;//a[]存储的是A,c[]存储的是A除以B的商int a[N], c[N];//

2021-06-14 16:19:04 290

原创 AcWing 793. 高精度乘法(高精度乘低精度,高精度乘高精度)

AcWing 793. 高精度乘法题意给定两个正整数,计算它们的积。正整数长度的范围是1到100000。分析1.高精度乘法分为高精度乘以低精度和高精度乘以高精度。算法1:高精度乘以低精度1.从高精度数的低位开始,每一个数位上的数都乘以低精度数,并把相乘结果存储在相对应的数位。2.接下来做进位处理,从低位向高位进位。算法2:高精度乘以高精度1.随机选择一个高精度数A,使A的每个数位分别与另一个高精度数B的每个数位相乘,相乘的结果存储到相对应的数位。2.接下来做进位处理,从低位向高位进位

2021-06-14 16:14:35 784

原创 AcWing 792. 高精度减法(数组模拟,C++)

题意给定两个正整数,计算它们的差,计算结果可能为负数。正整数长度的范围是1到100000。分析1.先把两个数分别倒序存储在数组中,即最低位在最左边,最高位在最右边。2.判断A和B哪个数更大,如果A大于B,则计算结果是正数;如果A等于B,则计算结果是0,;如果A小于B,则计算结果是负数。3.在进行减法运算时,是从最低位开始相减的;如果A在某个数位上的数比B小,则A向前一个高位借一个1(即相当于当前数位的10);最后再去掉A的前导零。4.最后倒序输出。代码#include <iost

2021-06-14 16:07:46 243

原创 AcWing 795. 前缀和(C++, 空间换时间)

AcWing 795. 前缀和题意输入一个长度为n的整数序列,接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。分析1.对于每次询问,如果都是直接计算a[l]+a[l+1]+…+a[r],那么时间复杂度就会是m*n。2.而使用前缀和就可以降低时间复杂度。3.前缀和就是创建一个新数组,新数组元素的定义为:s[i] = a[1] + … + a[i]。4.而求第l个数到第r个数的和就是求s[r]-s[l-1]代码#include <ios

2021-06-11 16:53:18 348

原创 AcWing 791. 高精度加法(C++,数组模拟)

AcWing 791. 高精度加法题意给定两个正整数,计算它们的和。正整数的范围是1到100000.分析1.先把两个数分别倒序存储在数组中,即最低位在最左边,最高位在最右边。2.然后按照人类的运算思维对每个位置上的数相加,注意要判断下进位。3.最后也是倒序输出。代码#include <iostream>using namespace std;const int N = 1e5 + 10;//a是输入的的第一个数,b是输入的第二个数,c是a和b相加后的结果int a[

2021-06-11 16:23:07 137 1

原创 AcWing 188. 武士风度的牛(BFS,C++)

AcWing 188. 武士风度的牛题意从一个起点遵循某种特殊规则走到终点,求最短的步数分析很显然,这题是bfs思想的应用。1.首先输入数据,并在每次输入数据时判断起点和终点的坐标。2.初始化队列,从起点开始按照规则进行遍历。规则是按照中国象棋马的走法,马在上下左右这四个基本方向上可以再往两个斜边走3.每次遍历坐标都要检查坐标是否合法,是否是障碍,是否之前被遍历过(因为这题是从中心向四周扩散,如果当前坐标已被标记了,那么就说明路径往回走了,就说明走重复了,也就说明不是最短路)4.对坐标进行应

2021-06-10 15:55:37 375

原创 AcWing 788.逆序对的数量(C++)

AcWing 788.逆序对的数量题意给n个数,求数列中的逆序对数量, i < j 且 a[i] > a[j] 则为一个逆序对分析1.可以使用穷举,把每个数和后面的数一一进行比较,每次操作的时间复杂度是O(n),有n次操作,最终时间复杂度为O(n*n)2.可以排序后再比较?不行!排序会把索引弄乱3.但是可以在归并排序的过程中找出逆序对的数量。说真的,我还真没想到这题能使用分治的思想来解决。分治法在“治”的过程中,还真没有改变元素的相对顺序代码#include <iostre

2021-06-10 12:47:31 144

原创 AcWing 787. 归并排序(C++)

AcWing 787. 归并排序题意输入一个乱序的数组,请使用归并排序对这个数组进行排序,并输出排序好的数组分析1.先判断区间内是否只有一个数,如果是,那么就返回到上一个函数(上一个函数肯定是有两个数)2.取一个边界点,以这个边界点分开两个区间,然后分别调用函数处理左半段的区间和右半段的区间3.将左半段和右半段的数一一进行比较,哪一个数更小就最先进入tmp数组4.一个区间处理完了,还需要把另一个区间未处理的数(这些数肯定是最大的了)全都放进tmp数组5.最后将tmp数组里的数全都复制到原数组

2021-06-10 12:42:35 107

原创 LeetCode 63. 不同路径 II

题意给一个m*n的矩阵,初始点位于矩阵的左上角,每次只能向下或者向右移动一步,矩阵的值如果是0则代表空位置,如果是1则代表障碍物,求从左上角移动到右下角总共有多少条不同的路径。分析这题与62题不同路径的区别在于这题有可能出现障碍物,那么很显然如果某个位置上有障碍物,则能到达这个位置的路径数是0。1.第一步先判断当前格子是否有障碍物,不论有多少条路径可以到达上面的格子与左边的格子,只要当前格子有障碍物,那么能到达当前格子的路径数肯定为0。2.接着需要判断左边的格子是否有障碍物,如果有,则能到达左边

2021-05-28 21:45:42 134

原创 LeetCode 60. 排列序列(枚举)

LeetCode 60. 排列序列题意给出集合 [1,2,3,…,n],其所有元素共有n!种排列。给定n和k,返回第k个按字典序排序的全排列。分析1.从左边到右边依次考虑每一位。2.对于每一位,从小到大依次枚举没有确定位置的数,然后确定当前位置的数值。 举个例子,这里n=4, k=11。 首先我们将所有排列按首位分组: 1. 1 + (2,3,4的全排列) 2. 2 + (1,3,4的全排列) 3. 3 + (1,2,4的全排列) 4. 4 + (1,2,3的全排列)

2021-05-28 19:13:02 170

原创 LeetCode 62. 不同路径(dp递推)

LeetCode 62. 不同路径题意给一个m*n的矩阵,初始点位于矩阵的左上角,每次只能向下或者向右移动一步,求从左上角移动到右下角总共有多少条不同的路径。分析这题是非常经典的dp递推问题,每次只能向下或者向右移动一步,也可以理解为想要到某一个位置上,只能从这个位置的左边或者上边来。因此可以得到状态转移方程: dp[i][j] = { dp[i][j] = dp[i][j - 1], i = 0 dp[i][j] = dp[i - 1][j], j = 0 dp[

2021-05-28 18:41:33 64

原创 LeetCode 61. 旋转链表(直接遍历)

LeetCode 61. 旋转链表题意给一个单链表,要求将链表中的每个节点向右移动k个位置。分析1.这题要特别注意数据范围,题干写了链表中节点的数目在范围[0,500]内,因此链表有可能一个节点也没有,需要特判是否为空。2.题干写了0 <= k <= 2 * 10e9,也就是k最少会移动0次,最多会移动2 * 10e9次,而链表最多有500个节点,因此要k%链表的长度。3.将链表每个节点向右移动k个位置,也就是将链表后面的k个节点移到前面去。3.1 找到链表倒数第k+1个节点和倒数

2021-05-28 17:58:39 60

原创 LeetCode 58. 最后一个单词的长度(遍历)

题意一个只有大小写字母和空格’ '组成字符串,求返回最后一个单词的长度分析1.使用指针从后向前扫描,过滤掉字符串后面的空格。如果过滤完空格就扫描完了,那么这字符串都是由空格组成的2.如果不全是空格,那么接下来扫描的就是最后一个单词了,把单词扫描到有空格或者超出索引范围代码c++class Solution {public: int lengthOfLastWord(string s) { //从最后的下标往前面遍历 int end = s.size()

2021-05-28 12:26:04 66

原创 LeetCode 56. 合并区间(左端点排序法,C++)

LeetCode 56. 合并区间题意以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。分析1.对所有区间以左端点为标准进行升序排序。2.遍历每一个区间时,查看当前区间的左端点是否小于等于上一个区间的右端点。2.1 如果小于等于,则说明当前区间与上一个区间是有交集的,然后比较这两个区间的右端点,选最大的那个点作为合并区间的右端点2

2021-05-28 11:54:32 240

原创 AcWing 15. 二维数组中的查找(模拟)

AcWing 15. 二维数组中的查找题意在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析1.仔细观察一下,发现最右边的那列数是比较特殊的,这列数的所有元素都是所在行的最大值。2.因此可以以右上角元素作为初始状态开始遍历,2.1 由于每一列是从上到下递增,如果target小于当前元素,那么target肯定会小于位于当前元素下面的值;2.2 由于每一行是从左到右递增,如果

2021-05-27 15:46:59 66

原创 AcWing 17. 从尾到头打印链表(反向迭代器)

AcWing 17. 从尾到头打印链表题意输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回的结果用数组存储。分析单链表只能从头遍历,因此最初的想法是从头遍历的时候,将数据输入到数组中,然后再将数组翻转。虽然也AC了,但是没有别人写得那么好。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(in

2021-05-27 12:55:24 84

原创 AcWing 24. 机器人的运动范围(BFS和DFS)

AcWing 24. 机器人的运动范围分析这题是一道非常经典可以使用BFS也可以DFS的搜索题,题干有四连通。①先做好一些初始工作:初始化队列、初始化记录状态的数组、初始化四连通数组②接着就让队列一直循环2.1 先从队列取值,再去掉队头2.2 判断是否满足条件,若不满足就下一次循环2.3 满足条件了,那就做题目中要求做的事。这题是要找能到达点有多少, 然后还要刷新状态2.4 从中心点向四周扩散(四连通、八连通)代码bfsclass Solution {public: int

2021-05-26 20:58:48 92

原创 LeetCode 1865. 找出和为指定值的下标对

LeetCode 1865. 找出和为指定值的下标对题意给你两个整数数组 nums1 和 nums2 ,请你实现一个支持下述两类查询的数据结构:1.累加 ,将一个正整数加到 nums2 中指定下标对应元素上。2.计数 ,统计满足 nums1[i] + nums2[j] 等于指定值的下标对 (i, j) 数目(0 <= i < nums1.length 且 0 <= j < nums2.length)。分析1.累加是仅将nums2中的元素进行操作,因此nums2的所有元素都

2021-05-23 19:00:45 97

原创 LeetCode 1864. 构成交替字符串需要的最小交换次数

LeetCode 1864. 构成交替字符串需要的最小交换次数题意给一个二进制字符串s,请将其转化为一个交替字符串,返回转化所需的最小字符交换次数, 如果无法完成转化,返回-1。交替字符串的定义:相邻字符之间不存在相等情况的字符串。例如:“010”和“1010”是交替字符串,但“0100”不是。任意两个字符都可以进行交换,不必相邻 。分析1.对于二进制字符串,里面的组成元素只有‘0’和’1’,因此对于固定长度的二进制字符串只有两种交替字符串状态:“010101…”和“101010…”2.那么给定

2021-05-23 18:46:28 539

原创 LeetCode 65. 有效数字(模拟,C++)

LeetCode 65. 有效数字分析1.找到字符串中字符’e’或者’E’第一次出现的位置。2.如果存在字符’e’或者’E’第一次出现的位置,那么可以将字符串分为两部分进行检查是否合法,‘e‘或者’E’之前的部分可以是整数或者小数,'e’或者’E’之后的部分必须是整数。3.如果字符’e’和字符’E’都没有出现过,则整个字符串可以是整数,也可以是小数。4.判断是否是合格的整数或者小数4.1 正负号只能出现在开头。4.2 如果要求不一定是整数,字符'.'最多出现一次;如果要求一定是整数,字符'.

2021-05-21 12:22:08 147

原创 LeetCode 57. 插入区间(模拟)

题意给一组相互之间没有重叠且已经按照区间左端点排序的区间,现要求插入一个新区间,求插入新区间后的区间状态。分析把所有区间分为三部分,一部分是在新区间左侧的没有重叠的区间, 一部分是在新区间右侧的没有重叠的区间,剩下的是与新区间有重叠的 区间,将它们合并。代码class Solution {public: vector<vector<int>> insert(vector<vector<int>>& a, vector<int

2021-05-20 12:38:33 54

原创 LeetCode 56. 合并区间(排序,贪心)

LeetCode 56. 合并区间题意以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。分析1.对所有区间以左端点为标准进行升序排序。2.遍历每一个区间时,查看当前区间的左端点是否小于等于上一个区间的右端点。2.1 如果小于等于,则说明当前区间与上一个区间是有交集的,然后比较这两个区间的右端点,选最大的那个点作为合并区间的右端点2

2021-05-20 11:58:02 146

原创 LeetCode 52. N皇后 II(下标映射)

LeetCode 52. N皇后 II题意在n*n的棋盘上,放上n个皇后,两个皇后不可以放在同一行、同一列、同一正对角线和同一副对角线。给一个整数 n ,返回 n 皇后问题不同的解决方案的数量。分析这题的思路与51题N皇后的思路是相同的,只不过51题是返回具体的解决方案,而这题是返回解决方案的数量。代码class Solution {public: int n, ans; vector<string> t;//用于存储当前棋盘的状态 //col用于记录每

2021-05-20 11:08:08 49

原创 LeetCode 51.N皇后(下标映射)

LeetCode 51.N皇后题意在n*n的棋盘上,放上n个皇后,两个皇后不可以放在同一行、同一列、同一正对角线和同一副对角线。给一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。分析每进入一行,遍历这一行的所有位置,每遍历到新的位置,检查这个位置所在的列、主对角线和副对角线是否三者都没有放皇后,如果满足,则在当前位置尝试放皇后,进入下一行;如果不满足,继续往右遍历。1.每次都是一行一行的放皇后,因此可以认为在当前行放皇后时,上面的每一行都已经了放了一个皇后,所以不需要数组来记录状态

2021-05-20 11:00:19 81 1

原创 LeetCode 53. 最大子序和(dp法)

LeetCode 53. 最大子序和题意给一个整数数组nums,要求找到一个具有最大和的连续子数组,并返回其最大和。PS:子数组必须是连续的。分析1.定义一个状态数组f,f[i]表示以第i个数字为结尾的最大连续子数组的总和2.base case:f[0] = nums[0]3.状态转移方程为f[i] = max(f[i - 1] + nums[i], nums[i]),可以理解每走一次有两种决策:一种是将当前元素和以上一个元素作为结尾的最大连续子数组和相加;另一种是将当前元素单独作为一个新

2021-05-20 09:20:09 84

原创 LeetCode 49. 字母异位词分组(排序法,C++)

LeetCode 49. 字母异位词分组题意给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串算法(排序法)1.将每一个字符串进行排序,看排序后的字符串有没有在哈希表中1.1如果在,则把原来的字符串放到相对应的数组中1.2如果不在,则把原来的字符串放到新的数组中2.重复以上操作把所有字符串遍历完设字符串个数为n,字符串的平均长度为m时间复杂度:O(n * m * log m) 空间复杂度:O(n * m)class Solution {public:

2021-05-19 22:16:46 220

原创 LeetCode 54. 螺旋矩阵(c++)

LeetCode 54. 螺旋矩阵题意题意:给一个二维数组,请按照顺时针螺旋顺序,返回矩阵中的所有元素。分析定义上界、下界、左界、右界。1.从左到右遍历,然后上界向下移动一行;2.从上往下遍历,然后右界向左移动一列;3.从右到左遍历,然后下界向上移动一行;4.从下往上遍历,然后左界向右移动一列。重复上面1到4的操作,直到遍历完整个矩阵。class Solution {public: vector<int> spiralOrder(vector<vector&l

2021-05-19 21:49:40 276

原创 AcWing 1129. 热浪(C++)

AcWing 1129. 热浪题意一个图中有T个点,C条无向边(连接 2 个城镇的道路),再给出一个起点和一个终点,求起点到终点的最短距离(数据保证至少存在一条道路)分析一个点到另一个点的最短距离怎么求? 当然是先求这个点到所有点的最短距离,然后就解决了,此题可以使用朴素dijkstra或者堆优化版dijkstra或者spfa,这确实是一道非常裸的求最短路模板题代码#include <iostream>#include <cstring>#include <qu

2020-11-19 17:01:35 845

原创 Dijkstra算法求最短路(堆优化版)

这篇文章是介绍Dijkstra算法的一种使用优先队列来求最短路的方式,下面将以一道模板题来进行说明AcWing 850. Dijkstra求最短路 II 题意求一个源点到 除了这个点之外其他所有的点 的最短距离, 不需要记录每条路径分析从输入案例来看,输入的应该是稀疏图,因此使用链式前向星来存储图等下会使用优先队列来优化找最短距离的点,c++优先队列的一种形式为priority_queue<Type, Container, Functional>Type 就是数据类型,Conta

2020-11-19 16:38:45 272

原创 Dijkstra算法求最短路(朴素版)

图论中求最短路的算法有很多,这里使用一道模板题来介绍可以求单源最短路的Dijkstra算法AcWing 849. Dijkstra求最短路 I题意求一个源点到 除了这个点之外其他所有的点 的最短距离, 不需要记录每条路径困惑这题一直困惑着我的是,为什么一开始找的最小的最短距离就是确定的最短距离?想了好久,后来慢慢就理解了。首先Dijkstra算法只能处理边权为正的图的最最短距离,既然所有边权都是正数,那么我们可以这样来想: 遍历了源点到所有点的距离,这里会发现源点到某一个点的距离是最

2020-11-19 15:56:59 202

原创 poj1321.棋盘问题

传送门题意在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。分析这题和N皇后有点相似,但还是有不同点:1.N皇后还要求对角线和辅对角线都不能放,需要使用额外数组去判断对角线和辅对角线有没有放过棋子2.N皇后初始化时每个位置只有一种状态,而这题初始化时每个位置有'#'和'.',只有'#'才可以放搜索的结束条件为:1.已经放好的棋子数量等于k,

2020-11-19 14:05:09 404

原创 AcWing 242. 一个简单的整数问题(树状数组解法)

AcWing 242. 一个简单的整数问题题意给定长度为N的数列A,然后输入M行操作指令。第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。第二类指令形如“Q X”,表示询问数列中第x个数的值。对于每个询问,输出一个整数表示答案。分析如果这题不是使用线段树,而是使用树状数组来解决,怎么做呢?怎么思考呢?树状数组仅支持单点修改和区间查询,但这题是要求区间修改和单点查询,好像跟树状数组反着来的。。。仔细观察一下,其实把A[l]到A[r]都加d,就是把l到r这个区间中的数都加d,

2020-11-13 20:36:54 131

原创 AcWing 238. 银河英雄传说(C++)

题目链接分析可以把每艘战舰进入队列时的顺序作为 属性值,表示为这艘战舰到队列头部战舰的距离,用d[i]表示i号战舰到头部战舰的距离,每次把一个战舰队列接到另一个战舰队列的尾部时, 把前者头部战舰的d[i]改为后者整个队列的长度, 然后后者队列长度 再加上前者队列长度代码 (带权并查集)#include <iostream>#include <algorithm>#include <cstring>using namespace std;const in

2020-11-10 14:49:25 437

原创 AcWing 837. 连通块中点的数量(C++)

837. 连通块中点的数量分析这题是并查集的典型应用,并查集可以用来维护无向图的连通块这题的三种操作可以这样理解:1.要求把两个点连起来,本质是把这两个点放到同一个集合中2.查询两个点是否在同一个集合中,本质是找这两个点所在集合的根节点是否相等3.查询某个点所在的集合的点的总数量因为这题有些操作是重复使用的,所以需要把功能独立出来,也就是写成函数函数1:初始化并查集,同时初始化每个集合的点的总数量函数2:并查集函数函数3:判断两个点是否在同一个集合函数4:合并两个点所在的集合代码#

2020-11-09 10:42:44 223

原创 并查集-路径压缩法

对并查集的理解我认为的并查集是:每一个集合抽象成一颗N叉数, 树上的每个节点存储的是双亲结点的位置,只有根节点存储的是自身编号,根节点代表了这棵树(即这个集合)并查集可以用来维护无向图的连通块,也可以用来解决具有传递性质的问题并查集主要有两种操作合并:将集合A根节点的值赋给集合B根节点,这样集合B的所有节点往上遍历时都会找到 集合A的根节点查询:找出这两颗树的根节点,判断是否相等,如果相等则是同一个集合,否则不是同一个集合图解从上图可见,把2所在的集合合并到6所在的集合后,2所在的集合的根节

2020-11-09 10:29:21 426

原创 AcWing 1140. 最短网络

题目链接题意给出n个点,并给出所有点之间的距离,本质就是求一张无向连通图的最小生成树分析从题目来看,这题的数据是保证有解的,还有按照输入格式来看,这应该是稠密图,使用邻接矩阵来存储图解决方案直接套用prim算法就行了代码#include <iostream>#include <cstring>using namespace std;const int N = 105;//g为邻接矩阵,d为每个点到集合S的距离(会一直更新),n为点数,ans为最小生成树

2020-09-16 09:05:41 87

原创 AcWing 1141. 局域网

题目链接题意有n个点,k条边,边权越小,线路就越通畅,要求去掉重边,使剩下的生成树的边权之和最小。分析按题目的意思来理解就是两点之间要留下边权最小的一条边,把其他边权较大的边去掉,即答案=全部边权之和 - 最小生成树从题目的数据范围来看,给出的图应该是稀疏图,因此使用kruskal算法解决方案把多余的重边去掉,留下边权最小的边代码#include <iostream>#include <cstring>#include <algorithm>us

2020-09-16 08:49:29 130

原创 AcWing 1112. 迷宫

题目链接题意给一个n*n的二维矩阵,矩阵中只有’.‘和’#‘这两种状态,’.‘表示可以走,’#‘是障碍,给出起点和终点,只能上下左右走(四连通),还需要注意两点:1.起点有可能就是终点 2.起点和终点都有可能是’#’分析题目是经典的dfs题,就判断是否到了终点没,没到终点就一直尝试往四个方向搜解决方案1.初始化数据,输入矩阵大小、初始化状态数组、输入起点终点坐标2.先判断起点和终点是不是’#’,然后再判断是否为同一坐标3.执行dfs,一直搜,如果有就标记答案变量,没有就不做标记踩坑

2020-09-15 20:26:16 152

原创 AcWing 859. Kruskal算法求最小生成树

AcWing 859. Kruskal算法求最小生成树前置问题Q:什么是生成树呢?A: 在一个图中,由n个点(其实就是所有顶点)和n-1条边所构成的连通子图(结构是一颗树)Q:怎么判断哪些点是在同一个连通块?A:使用并查集就行了,把每个独立的连通块看作是一个集合思想Kruskal算法是先把所有边按照边权大小进行排序,得到一个升序的序列,然后遍历每一条边,如果这条边的两个点不是在同一个集合,则选择当前的边权(因为排序过,所以当前边权也是两点之间的最小边权),顺便合并这两个点所在的集合;如果这两

2020-09-14 13:48:15 106

原创 AcWing 858. Prim算法求最小生成树

题目链接:AcWing 858. Prim算法求最小生成树题意使用prim算法找出包含所有点的却只有n-1条边的无向连通子图, 并求出子图的最小权值。分析此题是非常裸的prim算法题,直接套用模板就ok了,但是一定要理解思想是怎样的。思想将图分为两个集合,其中一个集合是最小生成树(一开始是空集),另一个集合是不属于最小生成树的点集S,每次都找离最小生成树最近的点,并把这个点加入最小生成树,然后利用刚增加的点去更新 其它点到最小生成树的距离这里定义一个数组d,d[i]的含义是从点i到集合S的最短

2020-09-14 13:08:18 150

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除