随笔分类 - 数据结构
摘要:能用到拓扑排序的前提: 必须是有向无环图。 如果有环,那么根本不可能形成拓扑排序; 算法流程: 用队列来执行 ,初始化讲所有入度为0的顶点入队。 主要由以下两步循环执行,直到不存在入度为 0 的顶点为止 选择一个入度为 0 的顶点,并将它输出;删除图中从顶点连出的所有边。循环结束, 若输出的顶点数小
阅读全文
摘要:首先用一个结构体存放原始的键值和下标。 然后遍历该结构体数组,如果当前遍历的节点的键值的绝对值没有在前面出现过,那么就再开一个数组用来存该节点的编号,并且标记为出现过,防止后续再次存他的下标。否则如果出现过,那么就再开一个数组存之前出现过的节点的下标。然后将头节点往后移,h = next[h] 如此
阅读全文
摘要:这题考察的就是数据结构里面的插入排序和归并排序的每一步的操作和流程。 可惜我太菜了。考试的时候做不出来! #include <bits/stdc++.h> using namespace std; const int N = 110; int a[N], b[N]; int n; int main(
阅读全文
摘要:#include <iostream> #include <queue> using namespace std; const int N = 40; struct node { int data; node *lchild; node *rchild; }; int last[N], in[N];
阅读全文
摘要:但是第二步求x的编号需要0(n) 的 时间复杂度。 需要进行优化; 压缩路径: 就是运用递归的方法,在找x的祖宗节点的时候,顺便把这一路上的父节点都连到祖宗节点上,那么下一次查询祖宗节点的时候只需0(1)的时间复杂度就可以了。 int find(int x) { if(f[x] != x) f[x]
阅读全文
摘要:要学会建堆,然后知道用数组模拟堆的优点。 #include <iostream> #include <cstring> #include <map> using namespace std; const int N = 1010; int heap[N]; int n, m; void insert
阅读全文
摘要:spfa求最短路径: spfa算法是对bellmanford算法的一个优化,其本质是:将每次更新过的点再用来去更新与其相邻的临点; Bellman_ford算法会遍历所有的边,但是有很多的边遍历了其实没有什么意义,我们只用遍历那些到源点距离变小的点所连接的边即可,只有当一个点的前驱结点更新了,该节点
阅读全文
摘要:bellman_ford算法用于解决: 有边数限制的最短路问题 可以用来判断是否有负环 什么是bellman - ford算法? Bellman - ford 算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在 n-1 次松弛
阅读全文
摘要:我们每次在找不在s中的距离最近的点都需要循环一次,这样的时间复杂度是0(n)的, 但是如果用小根堆来优化的话,那么时间复杂度会降到O(1),而且每个点的最短距离只会出现一次,会出冗余的情况,所以在出现冗余时,我们可以直接跳过。(觉得可以这么考虑,m条边都会进入队列,但是对于一个源点来讲只有最短的那条
阅读全文
摘要:一般用结构体创建链表运行会比较慢,所以需要一种更快的方法来满足算法竞赛中速度快的要求。 首先,用e[N]数组来存节点的值,ne[N]数组来存当前节点的下一个节点的地址(也可以说是下标)。这两个数组是相互关联的,它们之间通过下标相互关联的。 这里用-1表示空集,head的值表示头节点的下标,这个方法就
阅读全文