算法基础
文章平均质量分 84
Annabel_CM
这个作者很懒,什么都没留下…
展开
-
数论(c++)
文章目录1.等差数列2.X的因子链3. 聪明的燕姿4.五指山5.最大比例6.C 循环7.正则问题8.糖果1.等差数列ACWing1246. 等差数列数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?输入格式输入的第一行包含一个整数 N。第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数列中的顺序给出)输出格式输出一个整数表示原创 2021-02-04 15:16:32 · 1037 阅读 · 0 评论 -
疑难杂题
1.修改数组ACWing1242. 修改数组输入样例:52 1 1 3 4输出样例:2 1 3 4 52.倍数问题AcWing1234. 倍数问题3.斐波那契AcWing1213. 斐波那契4.距离AcWing1171. 距离输入样例1:2 2 1 2 100 1 2 2 1输出样例1:100100输入样例2:3 21 2 103 1 151 23 2输出样例2:10255. 剪格子AcWing1206. 剪格子输入样原创 2021-02-26 18:13:28 · 327 阅读 · 0 评论 -
树状数组与线段树
文章目录1.动态求连续区间和2.数星星3.数列区间最大值4.小朋友排队5.油漆面积6.三体攻击7.螺旋折线1.动态求连续区间和ACWing1264. 动态求连续区间和给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。输入格式第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。第二行包含 n 个整数,表示完整数列。接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。数列从原创 2021-01-26 21:52:37 · 418 阅读 · 0 评论 -
数学与简单DP
1. 买不到的数目ACWing1205. 买不到的数目输入样例:4 7输出样例:172.蚂蚁感冒ACWing1211. 蚂蚁感冒3. 饮料换购ACWing1216. 饮料换购4. 摘花生ACWing1015. 摘花生5.地宫取宝ACWing1212. 地宫取宝X 国王有一个地宫宝库,是 n×m 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。地宫的入口在左上角,出口在右下角。小明被带到地宫的入口,国王要求他只能向右或向下行走。走过某个格子时,如果那个原创 2021-02-16 12:30:28 · 162 阅读 · 0 评论 -
递归与递推
概念递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。递推:递推算法是一种用若干步可重复运算来描述复杂问题的方法。递推是序列计算中的一种常用算法。通常是通过计算机前面的一些项来得出序列中的指定象的值。递归与递推区别:相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。递推是一种关系,由小推大。将递推这种关系用某种计算机语言实现出来为递归。算法举例斐波那契数列:已知f(1) =原创 2021-01-14 11:50:53 · 2346 阅读 · 0 评论 -
贪心(习题)
文章目录1.股票买卖 II2. 糖果传递3. 雷达设备4.付账问题5.乘积最大6.后缀表达式7. 灵能传输1.股票买卖 IIACWing1055. 股票买卖 II2. 糖果传递ACWing122. 糖果传递输入样例:41254输出样例:43. 雷达设备ACWing112. 雷达设备输入样例:3 21 2-3 12 1输出样例:24.付账问题ACWing1235. 付账问题5.乘积最大Acwing1239. 乘积最大输入样例1:5原创 2021-02-24 15:46:10 · 221 阅读 · 0 评论 -
二分与前缀和
文章目录二分一. 机器人跳跃问题二. 四平方和三.分巧克力前缀和一.激光炸弹二.K倍区间二分一. 机器人跳跃问题Acwing730. 机器人跳跃问题机器人正在玩一个古老的基于DOS的游戏。游戏中有N+1座建筑——从0到N编号,从左到右排列。编号为0的建筑高度为0个单位,编号为 i 的建筑高度为H(i)个单位。起初,机器人在编号为0的建筑处。每一步,它跳到下一个(右边)建筑。假设机器人在第k个建筑,且它现在的能量值是E,下一步它将跳到第k+1个建筑。如果H(k+1)>E,那么机器人就原创 2021-01-18 09:48:34 · 313 阅读 · 1 评论 -
复杂DP
文章目录1.鸣人的影分身2.糖果3.密码脱落4.生命之树5. 斐波那契前 n 项和6. 包子凑数7. 括号配对8. 旅游规划9. 垒骰子1.鸣人的影分身ACWing1050. 鸣人的影分身输入样例:17 3输出样例:82.糖果ACWing1047. 糖果输入样例:5 712345输出样例:14样例解释Dzx的选择是2+3+4+5=14,这样糖果总数是7的倍数,并且是总数最多的选择。3.密码脱落1222. 密码脱落输入样例1:ABCBA输出样例原创 2021-02-17 21:33:30 · 338 阅读 · 0 评论 -
枚举 模拟
文章目录枚举1.连号区间数2. 递增三元组模拟1.特别数的和2.错误票据3.移动距离4.日期问题5.航班时间6.外卖店优先级枚举1.连号区间数ACWing1210. 连号区间数小明这些天一直在思考这样一个奇怪而有趣的问题:在 1∼N 的某个排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。当 N 很小的时候,小明可以很快地算出答案,但是当转载 2021-01-21 16:57:06 · 435 阅读 · 0 评论 -
蓝桥杯练习题1
文章目录1.乘法表2.最大降雨量3.不同子串4.第几个幸运数1.乘法表九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。例如,四进制下的乘法表如下所示:1*1=12*1=2 2*2=103*1=3 3*2=12 3*3=21请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。给定 P,请输出 P 进制下的乘法表。输入格式输入一个整数 P。输出格式输出 P 进制下的乘法表。P 进制中大于等于 10 的数字用大写字母 A、B、C、⋯ 表原创 2021-04-02 13:36:05 · 550 阅读 · 0 评论 -
双指针、BFS与图论
文章目录1.日志统计2.献给阿尔吉侬的花束3.红与黑4.交换瓶子5. 完全二叉树的权值6.地牢大师7.全球变暖8.大臣的旅费1.日志统计ACWing1238. 日志统计小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。其中每一行的格式是:ts id 表示在 ts 时刻编号 id 的帖子收到一个”赞”。现在小明想统计有哪些帖子曾经是”热帖”。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。具体来说,如果存在某个时原创 2021-01-30 16:16:14 · 358 阅读 · 0 评论 -
位运算(c++)
基本思想主要运用:求n 的二进制表示中第k为数字: n >> k & 11.先把第k位移到最后一位 n>>k2.看这个位置是几 x & 1求返回n 的最后一位1:lowbit(n)= n & -n = n &(~n + 1) 例如:n = 10101000 lowbit(n) = 1000基本模板来自yxc求n的第k位数字: n >> k & 1返回n的最后一位1:lowbit(n) = n & .原创 2020-07-15 14:35:50 · 791 阅读 · 0 评论 -
双指针算法(c++)
基本思想将for(int i = 0; i < n; i++)for(j = 0; j <n; j++)时间复杂度O(n^2)优化到O(n)基本模板来自yxcfor (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}//常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序.原创 2020-07-15 11:23:32 · 1150 阅读 · 0 评论 -
贪心(C++)
贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。解题的一般步骤是:1.建立数学模型来描述问题;2.把求解的问题分成若干个子问题;3.对每一子问题求解,得到子问题的局部最优解;4.把子问题的局部最优解合成原来问题的一个解。AcWing 905. 区间选原创 2020-12-26 19:55:38 · 794 阅读 · 0 评论 -
滑雪——记忆化搜索(C++)
AcWing 901. 滑雪给定一个R行C列的矩阵,表示一个矩形网格滑雪场。矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。下面给出一个矩阵作为例子: 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9在给定矩阵中原创 2020-12-25 22:36:58 · 909 阅读 · 0 评论 -
没有上司的舞会——树形DP(C++)
AcWing 285. 没有上司的舞会Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第 i 行表示 i 号职员的快乐指数Hi。接下来N-1行,每行输入一对整数L, K,表示原创 2020-12-25 22:25:26 · 315 阅读 · 0 评论 -
状态压缩DP(c++)
所谓的状态压缩DP,就是用二进制数保存状态。为什么不直接用数组记录呢?因为用一个二进制数记录方便作位运算。AcWing 291. 蒙德里安的梦想求把N* M的棋盘分割成若干个1*2的的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0,M=0时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果,每个结果占一行。数据范围1≤N,原创 2020-12-25 22:09:35 · 872 阅读 · 0 评论 -
计数问题——数位统计DP(c++)
AcWing 338. 计数问题给定两个整数 a 和 b,求 a 和 b 之间的所有数字中0~9的出现次数。例如,a=1024,b=1032,则 a 和 b 之间共有9个数如下:1024 1025 1026 1027 1028 1029 1030 1031 1032其中‘0’出现10次,‘1’出现10次,‘2’出现7次,‘3’出现3次等等…输入格式输入包含多组测试数据。每组测试数据占一行,包含两个整数 a 和 b。当读入一行为0 0时,表示输入终止,且该行不作处理。输出格式每组数据输出一原创 2020-12-25 21:08:10 · 766 阅读 · 0 评论 -
整数划分——计数类DP(c++)
AcWing 900. 整数划分一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对109+7取模。数据范围1≤n≤1000输入样例:5输出样例:7思路:把1,2,3, … n分别看做n个物体的体积,这n个物体均无原创 2020-12-25 20:18:30 · 502 阅读 · 0 评论 -
区间DP——动态规划(C++)
区间DP概念区间类型动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。特点1、合并:即将两个或多个部分进行整合。2、特征:能将问题分解成为两两合并的形式。3、求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。例题AcWing 282. 石子合并设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子原创 2020-12-05 19:35:04 · 810 阅读 · 0 评论 -
背包问题——动态规划(c++)
定义背包问题指这样一类问题,题意往往可以抽象成:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。经典例题1.AcWing 2. 01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两.原创 2020-12-04 22:11:32 · 5211 阅读 · 1 评论 -
编辑距离——线性DP(C++)
定义编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。AcWing 902. 最短编辑距离给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。插入–在字符串A的某个位置插入某个字符。替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为原创 2020-11-30 22:16:52 · 619 阅读 · 0 评论 -
最长公共子序列——线性DP(C++)
AcWing 897. 最长公共子序列给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤1000输入样例:4 5acbdabedc输出样例:3算法分析状态表示集合:所有在A[1…i]中出现过且在B[1…j]中也出现过的子原创 2020-11-30 15:32:37 · 286 阅读 · 0 评论 -
最长上升子序列——线性DP(C++)
AcWing 895. 最长上升子序列给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4思路此处要分析动态规划中的状态表示,f[i]的意义是以第i个为结尾的上升子序列,而我们需要求的属性是MAX,对于f[i]我们可以划分为 以i之前一个数为结尾的上升子序原创 2020-11-30 15:12:42 · 4618 阅读 · 0 评论 -
数字三角形——线性DP(c++)
线性DP定义即线性动态规划,不局限于“线性时间复杂度”的一维动态规划。与数学中的“线性空间”类似,如果一个动态规划算法的“状态”包含多个维度,但在每个维度上都具有“线性”变化的“阶段”,那么该动态规划算法同样称为“线性DP"。经典例题AcWing 898. 数字三角形给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 .原创 2020-11-29 23:53:19 · 563 阅读 · 0 评论 -
博弈论(初级)——数学知识(C++)
转载说明Wolfycz以上是原文链接,请大家支持原创。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。博弈博弈==,具体的例子就是下棋,双方都考虑最有利于自已的步骤,但是最终必有一方输,一方赢。博弈的策略:参与者在行动之前所准备好的一套完整的行动方案,就是想好下完这步棋,对方会如何下,以及接下来该如何下,最终得出结果。常见的博弈有以下:1.博弈:合作博弈和非合作博弈合作博弈:指参与者能够达成一种具有约束力的协议,在协议范围内选择有利于双方的策略非合作博弈:指参与者.原创 2020-11-28 17:43:13 · 4716 阅读 · 0 评论 -
容斥原理——数学知识(c++)
容斥原理可以描述如下:要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。用维恩图来表示集合A、B和C:经典例题AcWing 890. 能被整除的数给定一个整数n和m个不同的质数p1,p2,…,pm。请你求出1~n中能被p1,p2,…,pm中的至少一个数整除的整数有多少个。输入格式第一行包含整数n和m。第二行包含m个质数。输出格式输出一原创 2020-11-28 16:43:13 · 1181 阅读 · 0 评论 -
求组合数——数学知识(c++)
组合数的公式:一、递推(杨辉三角)AcWing 885. 求组合数 I 给定n组询问,每组询问给定两个整数a,b,请你输出Cba mod (109+7)的值。输入格式第一行包含整数n。接下来n行,每行包含一组a和b。输出格式共n行,每行输出一个询问的解。数据范围1≤n≤10000,1≤b≤a≤2000输入样例:33 15 32 2输出样例:3101#include <iostream>#include <algorithm>u原创 2020-11-16 15:01:49 · 916 阅读 · 0 评论 -
高斯消元——数学知识(c++)
高斯消元概述高斯消元法主要用于求解线性方程组,也可以求矩阵的秩、矩阵的逆等,是一个重要的数学方法。其时间复杂度主要与方程组个数、方程组未知数个数有关,一般来说,时间复杂度为 O(n3)线性方程组:有多个未知数,且每个未知数的次数均为一次,这样多个未知数所组成的方程组。高斯消元法的基本思想是:通过一系列的加减消元运算,直到得到类似 kx=b 的式子,然后逐一回代求解 x 向量高斯消元步骤枚举每一列c,1、找到当前列绝对值最大的一行2、用初等行变换(2) 把这一行换到最上面(未确定阶梯.原创 2020-11-03 23:26:17 · 2223 阅读 · 0 评论 -
中国剩余定理——数学知识(c++)
经典例题AcWing 204. 表达整数的奇怪方式给定 2n 个整数a1,a2,…,an和m1,m2,…,mn,求一个最小的非负整数 x,满足∀i∈[1,n],x≡mi(mod ai)。输入格式第1 行包含整数 n。第 2…n+1行:每 i+1 行包含两个整数ai和mi,数之间用空格隔开。输出格式输出最小非负整数 x,如果 x 不存在,则输出 −1。如果存在 x,则数据保证 x 一定在64位整数范围内。数据范围1≤ai≤231−1,0≤mi<ai1≤n≤25输入样例:..原创 2020-11-01 23:18:56 · 587 阅读 · 1 评论 -
扩展欧几里得算法——数学知识(c++)
1.扩展欧几里得算法贝祖定理若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by=m中的m一定是d的倍数。(特别地,如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。)以上图片来自zeroACAcWing 877. 扩展欧几里得算法给定n对正整数ai,bi,对于每对数,求出一组xi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)。输入格式第一行包含整数n。接下来n行,每行包含两个整数ai,bi。输出格式输出共n行,对于每组a原创 2020-11-01 23:07:12 · 1558 阅读 · 0 评论 -
快速幂——数学知识(c++)
快速幂的目的就是做到快速求幂假设我们要求ab,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下:假设我们要求ab,那么其实b是可以拆成二进制的,该二进制数第i位的权为2(i-1),例如当b==11时a11=a(20+21+23)11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a20*a21*a23,也就是a1*a2*a8 ,看出来快的多了吧原来算11次原创 2020-10-31 22:46:50 · 488 阅读 · 0 评论 -
欧拉函数——数学知识(c++)
定义:欧拉函数表示1-N中与N互质的数的个数;给定一个数n,求在[1,n]这个范围内两两互质的数的个数对于这个范围内的每一个数,我们只要找到不超过这个数且与这个数互质的数的个数就可以了欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.欧拉函数的简单性质1.欧拉函数是积性函数(非完全);积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数。完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数。2.除了N=2,φ(N)都是偶数;3.原创 2020-10-29 13:17:27 · 2520 阅读 · 1 评论 -
约数——数学知识(C++)
一、定义若整数n除以整数d的余数为0,即d能整除n,则称d是n的约数,n是d的倍数,记为d|n。算数基本定理的推论一个大于1的正整数N,如果它的标准分解式为:那么它的正因数个数为它的全体正因数之和为二、约数的判定:试除法AcWing 869. 试除法求约数给定n个正整数ai,对于每个整数ai,请你按照从小到大的顺序输出它的所有约数。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出共n行,其中第 i 行输出第 i 个整数ai的所有约数。数据范围1≤.原创 2020-10-29 12:44:06 · 5174 阅读 · 0 评论 -
质数——数学知识(c++)
一、定义若一个正整数无法被除1和它自身以外的自然数整除,则该数为质数(或素数),否则该数为合数。1既不是质数也不是合数。由定义可得质数的一个性质:只有1和它本身两个因数。补充:对于一个足够大的整数N,不超过N的质数大约有N/㏑N个。即每㏑N个数中有1个质数。二、判定质数根据定义:素数就是一个数除了1 和他本身没有其他因数的数叫做质数。于是我们对于一个N,可以可以从2枚举到N−1,从而判断这个数是不是质数。bool Is_prime(int n){ if(n==1) retur.原创 2020-10-29 09:58:25 · 4226 阅读 · 1 评论 -
匈牙利算法——图论(C++)
一、基本概念1、匹配:在图论中,一个「匹配」是一个边的集合,其中任意两条边都没有公共顶点。2、最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。3、完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。4、交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。5、增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替 路称为增广路(agumenting path)。6、匈牙利算法.原创 2020-10-21 22:43:52 · 1116 阅读 · 0 评论 -
染色法判定二分图——图论(C++)
一、基本定义与思想1、二分图二分图又称作二部图,是图论中的一种特殊模型。设G=(V, E)是一个无向图。如果顶点集 V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在 X中,另一个在 Y中,则称图G为二分图。2、性质定理:当且仅当无向图G的每一个环的结点数均是偶数时,图G才是一个二分图。如果无环,相当于每的结点数为 0,故也视为二分图。3、判定如果一个图是连通的,可以用如下的染色法判定是否二分图:1、我们把X部的结点颜色设为0,Y部的颜色设为1。2、从某个未染色.原创 2020-10-21 22:05:20 · 918 阅读 · 2 评论 -
Kruskal(克鲁斯卡尔)——图论(C++)
一、基本思想此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。把图中的所有边按代价从小到大排序;把图中的n个顶点看成独立的n棵树组成的森林;按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。图片来自a2392008643prim算法适合稠密图,kruskal算法适合简.原创 2020-10-21 21:51:45 · 1176 阅读 · 0 评论 -
Prim——图论(C++)
一、最小生成树对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同,设r为G的所有生成树的集合,若T为r中边的权值之和最小的那棵生成树,则T称为G的最小生成树。二、最小生成树的性质1、最小生成树不是唯一的。2、最小生成树的边的权值之和总是唯一的3、最小生成树的边数为顶点数减1,即边数=n-1(n为顶点数)三、 Prim算法的基本思想每个顶点初始化为正无穷,每次选择一个到集合距离最小的点加入集合,更新n次dist[i]距离设置为无穷大.原创 2020-10-21 21:29:34 · 416 阅读 · 0 评论 -
Floyd——图论(C++)
一、算法的特点求任意两个顶点之间的最短路径可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题同时也被用于计算有向图的传递闭包。二、算法的思路1、通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,2、矩阵D中的元素a[i][j]表示顶点i到顶点j的距离。3、矩阵P中的元素b[i][j],表示顶点i到顶点j经过了b[i][j]记录的值所表示的顶点。4、初始时,矩阵D中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞原创 2020-10-21 13:08:56 · 420 阅读 · 0 评论