- 博客(18)
- 收藏
- 关注
原创 拓扑排序板子及其应用
int n, m;#define N100010n和m分别表示图中的节点数和边数。N是预定义的常量,表示节点的最大数量。e 和 ne 是数组,用于存储图的边信息。e[i] 表示边的目标节点,ne[i] 存储与当前节点相连的下一条边的索引。h数组用于存储每个节点的边的开始部分,即每个节点的邻接表的头部。idx 是用于填充 e和 ne 数组的当前索引。d数组用于存储每个节点的入度。queue 用于实现拓扑排序的队列,head 和 tail 分别是队列的头部和尾部索引。
2024-05-12 19:09:01 342
原创 FloodFill算法及其应用
给定一个地形图,浅色表示洼地,深色表示高地。向这个图中的一个格子注水,随后询问这个格子的四个方向上的格子,显然,只有浅色的格子才可以被洪水覆盖,高低不会被覆盖。这个算法可以在线性复杂度内找到某个点所在的连通块。
2024-05-11 22:12:58 1556 1
原创 并查集的作用、原理、实现及应用
每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。如何求x的集合编号:while (p[x]!= x) x = p[x] 优化:路径压缩。如何合并两个集合:px是x的集合编号,py是y的集合编号。p[px] = py。如何判断树根:if (p[x] == x) 除了根节点之外p[x]都不等于x。
2024-05-05 19:05:31 191
原创 二分(整数二分,浮点数二分)
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
2024-05-05 17:13:24 294
原创 容斥原理及其应用
如果被计数的事物有A、B两类,则A类和B类元素的总和=A类元素个数+B类元素个数—既是A类又是B类的元素个数。即$$$$如果被计数的事物有A、B、C三类,那么,A类和B类和C类元素个数总和= A类元素个数+ B类元素个数+C类元素个数—既是A类又是B类的元素个数—既是A类又是C类的元素个数—既是B类又是C类的元素个数+既是A类又是B类而且是C类的元素个数。 即∣A∪B∪C∣∣A∣∣B∣∣C∣−∣A∩B∣−∣A∩C∣−∣。
2024-04-28 19:05:40 614
原创 数组模拟链表,链式前向星及其应用
define N100010//根据上图可以更好理解//head表示头节点的下标 e[i]表示节点i的值是多少 ne[i]表示节点下一个节点的下标//idx表示当前可以用的点的下标#define N100010邻接表有n个链表(n为图的节点数量)。其余初始化与链表的初始化类似。h[]存储每个顶点链表的头部索引。e[]存储边的目标顶点。ne[]存储同一链表中下一个元素的索引。idx是当前可用的数组索引。
2024-04-26 22:09:36 1717 4
原创 二叉树的前序遍历,中序遍历,后序遍历和层序遍历
【前序遍历】如果二叉树为空,则直接返回。否则,先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。【中序遍历】如果二叉树为空,则直接返回。否则,先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。(即逐层地,从左到右访问所有节点)。给定一个二叉树的根节点。给你一棵二叉树的根节点。
2024-04-19 19:56:23 697
原创 [NOIP2008 提高组] 笨小猴
但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出。是单词中出现次数最少的字母的出现次数,如果。是单词中出现次数最多的字母的出现次数,次,出现次数最少的字母出现了。次,出现次数最少的字母出现了。noip2008 提高第一题。【输入输出样例 1 解释】【输入输出样例 2 解释】(本处原题面错误已经修正)
2024-04-12 13:56:30 600 1
原创 洛谷 T3 句子反转题解
要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。的数据,句子中包含的单词数量不超过。仅一行,表示程序对句子的处理结果。仅一行,即需要反转的句子。,每个单词长度不超过。
2024-04-08 13:02:46 368
原创 顺序表实现栈
对于顺序表,在 C语言 中表现为数组,在进行栈的定义之前,我们需要考虑以下几个点:1)栈数据的存储方式,以及栈数据的数据类型;2)栈的大小;3)栈顶指针;我们可以定义一个栈的结构体,C语言实现如下所示:int// (1)100005// (2)// (4)int top;// (5)(1) 用DataType这个宏定义来统一代表栈中数据的类型,这里将它定义为整型,根据需要可以定义成其它类型,例如浮点型、字符型、结构体 等等;(2)maxn代表我们定义的栈的最大元素个数;
2024-04-07 18:50:50 1532
原创 快速排序和堆排序
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
2024-04-07 18:49:56 278
原创 堆排序的实现
调整堆(AdjustHeap)。调整堆的目的是确保以某个节点为根的子树满足堆的性质(最大堆或最小堆)。这里我们假设要实现的是最大堆。在堆(无论是最大堆还是最小堆)的数据结构中,左子节点和右子节点与它们的父节点之间存在特定的关系。这些关系确保了堆的性质得以维持。对于任何给定的父节点,其左子节点的索引通常可以通过公式计算得出,而右子节点的索引则通过公式计算得出。这里,是父节点在数组中的索引。
2024-04-06 17:09:04 346 1
原创 洛谷P1011车站问题题解
火车从始发站(称为第1站)开出,在始发站上车的人数为 a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。于是通过倒数第二站总人数为m列出方程:g(n-2)a+g(n-1)b-b+a=m即b=(m-g(n-2)a-a)/(g(n-1)-1) (n>=3)
2024-04-06 15:06:20 570
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人