数据结构
可惜浅灰
Linux、C/C++
展开
-
二分法穷举的一般格式
题目中需要找最大值: 需要尽量向上靠拢,判定成功后提高下界,int low = 0, high = max;int ans = 0;while (high >= low){ int mid = (high + low) / 2; if (Judge(mid)) { ans = mid; low = mid + 1; } else { high = mid - 1; }...原创 2021-09-30 10:46:30 · 410 阅读 · 0 评论 -
拓扑排序算法
算法步骤: 1、遍历所有结点,找出入度为0的结点作为源点输出; 2、在图中删除源点作为弧尾的有向边; 3、重复1和2,直到不存在入度为0的阶段; 4、若输出的点数小于结点总数说明图中有环,无法得到完整的拓扑序列,只能输出有确定先后关系的那一部分序列。代码实现:#include <iostream>#include <stack>using namespace std;#define maxn ...原创 2021-09-26 20:59:44 · 275 阅读 · 0 评论 -
SPFA算法:判断负环
算法同利用SPFA算法求单源点最短路径一致SPFA算法:找单源点最短距离_可惜浅灰的博客-CSDN博客再此基础上增加了sum数组,用于统计各个结点的入队次数,只要发现有结点的出队次数不小于结点总数,则有负环;反之,若算法函数运行结束后仍然没有结点的入队次数不小于结点总数,则没有负环。代码实现:#include <iostream>#include <queue>using namespace std;#define maxn 100int n, m;.原创 2021-09-25 10:15:57 · 527 阅读 · 0 评论 -
SPFA算法:找单源点最短距离
SPFA算法: Dijkstra算法的改进版,整体思想同Dijkstra算法一致。1、保存一个带权有向图 使用链式前向星保存一个有向图class Edge{public: int to; int weight; int next;};Edge e[maxn << 1];void InsertEdge(int u, int v, int w) { e[++cnt].to = v; e[cnt].next = head[u];...原创 2021-09-24 21:08:48 · 197 阅读 · 0 评论 -
Bellman-Ford算法:有向图中判负环
1、有向图的存储:用边集数组存储一个有向图class Edge{public: int u; int v; int weight;};Edge edge[maxn << 1];void InsertEdge(int u, int v, int w){ edge[++cnt].u = u; edge[cnt].v = v; edge[cnt].weight = w;}void CreateGraph()...原创 2021-09-24 14:03:59 · 1337 阅读 · 0 评论 -
Floyd算法:各顶点之间最短路径
非常简单,利用插点法,在边的两个顶点之间插入一个新结点,看是否能够缩短原来两结点之间的距离。代码实现:#include <iostream>using namespace std;#define maxn 100#define max_value 0x3f3f3f3fint dist[maxn][maxn], p[maxn][maxn];class Graph{public: int edge[maxn][maxn]; int ve...原创 2021-09-23 09:33:13 · 268 阅读 · 0 评论 -
Dijkstra算法:找单源点最短路径
Dijkstra算法: 把所有结点划分成连个集合V和V-S、S中是已经找到最短距离的结点集合、V-S是暂时还没有找到最短距离的结合,初始时S中只有源点,每次在V-S中找出距离S中距离最小的结点t,将其加入S集合,同时更新V-S中结点到S的最短距离,直到V-S为空,得到图中所有结点距离源点的最短距离。1、保存一个带权有向图用邻接矩阵存储一个有向图,若有u到v有边,则edge[u][v]记录权值,否则将其记录为无穷大class Graph{pu...原创 2021-09-22 17:16:14 · 337 阅读 · 0 评论 -
Tarjan算法应用:统计有向图中的强连通分量
有向图中的强连通分量是指,任何两个顶点都能相互到达的子图。有向图中的Tarjan算法步骤:1、构建一个有向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点传入函数,初始时:dfn = low = 次序, 3、将根节点入栈并标记; 4、遍历邻接点,若邻接点未被访问,递归,递归后更新low值;若邻接点已经访问且在栈中,说明之间有有...原创 2021-09-21 13:52:43 · 183 阅读 · 0 评论 -
Tarjan算法应用:统计无向图中的连通分量
连通分量是指在无向图中,任意两个顶点能互相到达的极大连通子图,再填任一结点就不能互相连通。 Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为他自己)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新...原创 2021-09-21 10:42:25 · 1005 阅读 · 0 评论 -
Tarjan算法应用:无向图找割点
无向图中的割点是指去掉一个结点后,分裂成两个或更多互不相通的子图,这个结点称为割点。Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为他自己)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新low值;若邻接点已经访问...原创 2021-09-20 10:40:13 · 276 阅读 · 0 评论 -
Tarjan算法应用:无向图找桥
无向图中的桥是指去掉一条无向边后,分裂成两个互不相通的子图,这条无向边称为桥。Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为一个无效值)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新low值;若邻...原创 2021-09-19 16:29:12 · 867 阅读 · 0 评论 -
图的广度优先搜索(BFS)
广度优先搜索是从顶点出发,先遍历完其所有邻接点,在依次遍历访问过结点的邻接点,像声波扩散;具有先来先服务特性,适合用队列。算法步骤: 1、建立bool类型访问标记数组,并初始化所有元素为false,代表每个结点都没有被访问; 2、以图中的某个指定结点作为顶点,访问并标记后入队; 3、将队头元素出队,访问其所有邻接点,若未访问则访问并标记后入队,循环操作直到队列为空。代码实现:#include <iostream&g...原创 2021-09-17 15:14:01 · 245 阅读 · 0 评论 -
图的深度优先搜索(DFS)
深度优先是指要一条路走到黑,遍历具有后来先服务的特性,适合用递归。算法步骤: 1、建立bool类型访问结点标记数组,并初始化所有元素为false,代表每个结点都没有被访问; 2、以图中的的一个结点为原点v,访问v并在访问标记数组中标记已访问; 3、遍历v的所有邻接点,若有未访问,递归。代码实现:#include <iostream>using namespace std;#define maxn 10bool visit...原创 2021-09-15 18:49:45 · 346 阅读 · 2 评论 -
图的存储——链式前向星
1、定义顶点数组和边集数组 在顶点数组中,下标代表边的一个顶点,存储的元素是该顶点的第一条边在边集数组中的下标。 边类有3个成员:边的另一个顶点、边的权值、顶点的下一条边的下标。int head[max_vertex_num];class Edge{public: int to; //边的另一个顶点 int weight; //边的权值 int next; //下一条边的下标};Edge edge[max_edge_n...原创 2021-09-14 13:56:29 · 107 阅读 · 0 评论 -
邻接矩阵存储无向图
邻接矩阵的优势: 可以快速判断两个顶点之间是否有边; 方便计算各顶点的度,无向图中:顶点i的度 = 邻接矩阵第i行(列)中的元素和;有向图中:顶点的出度 = 邻接矩阵第i行中的元素和,顶点的入度 = 邻接矩阵第i列中的元素和。...原创 2021-09-14 12:58:19 · 2912 阅读 · 0 评论 -
树的最小带权路径问题:百练4080 哈夫曼编码树
题目描述:Construct an expanded binary tree with nexternal nodes, each external node Ki related to a weight Wi, which minimizes thesum of the external path length of leaf: Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)Wi: the weight of each nodeLi: the pat原创 2021-09-13 10:16:55 · 350 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
哈夫曼编码描述: 哈夫曼编码利用字符的使用频率来编码,采用不定长的编码方法,使经常使用的字符编码较短,而不经常使用的字符编码较长; 哈夫曼编码有两个特点:1、编码尽可能短,使用频率越高,编码越短;2、编码不能有二义性,一个字符的编码不能是另一个字符编码的前缀。哈夫曼树的构建: 1、首先定义结点类,每一个结点有5个成员:权值(使用频率)、父亲、左孩子、右孩子、本身的值;class Node{publi...原创 2021-09-12 09:55:06 · 773 阅读 · 0 评论 -
遍历序列还原二叉树2
采用两个数组存储左右孩子结点的值。仍然是三步:1、前序(后序)找根;2、中序分左右;3、还原创建代码实现:原创 2021-09-10 15:38:52 · 109 阅读 · 0 评论 -
遍历序列还原二叉树
二叉树可以由中序序列和前序序列,或者中序序列和后序序列唯一还原一棵二叉树。算法步骤:1、先序(后序)找根;2、中序分左右;3、递归还原详细步骤: 1、建立数的结点类,有3个成员,data是char类型存放该结点的值,lchild和rchild是指针类型,用于指向该结点的左右孩子结点; 2、输入树中结点的个数,并输入先序遍历序列和后序遍历序列,用数组存储; 3、递归创建树,返回值为Node*类型,用于返回根;参数为先序序列数组、中序序列数组和数组的长度len,递归结束条件...原创 2021-09-09 10:31:08 · 1195 阅读 · 1 评论 -
C++版二叉树的创建与遍历
使用补空法创建了一棵二叉树,并且实现了先序遍历、中序遍历、后序遍历、层次遍历功能。1、定义结点类:要创建二叉树首先要定义二叉树的结点类,二叉树上每一个结点有3个成员变量,一个存放当前结点的值,其余两个是指针类型,分别指向此节点的左孩子和右孩子;class Node{public: char data; Node* lchild; //指向左孩子 Node* rchild; //指向右孩子};using Tree = Node*; 2、使用补空法创原创 2021-09-08 14:35:15 · 3290 阅读 · 2 评论 -
C++版模式匹配KMP算法
字符串的KMP算法用于找父串中子串最先出现处首元素的位置。 1、定义两个变量i和j,分别作为在父串和子串中要比对字符的自然序; 2、与BF算法相同:若父串i处元素和子串j处元素相等,i和j都后移。但若匹配不成功,只有j回 退。 与BF算法相比,KMP算法有两个特点:i不回退;j回退的位置需要单独求出,这是KMP算法的关键。求j回退的位置: 1、建立数组go_back[],其中go_back[j]为j要回退的位置; 2.采用动态规划来求解go_back...原创 2021-09-05 16:05:50 · 196 阅读 · 0 评论 -
C++版模式匹配BF算法
有两个字符串,找到子串在父串中的位置,返回子串在父串中的第一个字符下标: 1、定义两个变量i和j,分别作为在父串和子串中要比对字符的下标; 2、设置while循环,条件为i和j都不能超出各自字符串的尺寸; 3、循环中,从0位置开始依次比对元素,若父串中i位置上的元素的值==子串j位置上的元素的值:j++;i++;。若不等于,i回退到i - j + 1、j回退到0。 4、循环完毕后,匹配成功的标志是j等于子串的长度,成功后,子串在父串首次出现的下标为i减去子串的长度。...原创 2021-09-03 22:16:47 · 541 阅读 · 0 评论 -
C++版顺序栈
栈是一种先进后出、后进先出的线性序列,有入栈、出栈1、定义顺序栈栈的结构体 栈的结构体有两个成员变量,一个是栈顶指针,指向栈顶元素的上一个位置;一个是栈底指针,指向栈的底部。struct Stack{ int* base; //栈底指针 int* top; //栈顶指针};2、顺序栈初始化 给顺序栈分配一段内存空间,内存空间的容量即为栈的容量,动态分配返回的空间基地址作为栈底指针; 初始时,栈顶指针等...原创 2021-08-27 20:33:00 · 2934 阅读 · 2 评论 -
C++版单链表
单链表的初始化与创建,以及一些基本的功能,插入、遍历、删除、查找、取值。1、首先定义链表中结点的数据结构,分为两个部分数据域和指针域;//定义结点类型结构体typedef struct Lnode{ int data; Lnode* next;}*List, *Lnodeptr;2、定义初始化函数,用来初始化链表创建一个数据域空白的头结点,指针域暂时指空。//初始化bool InitList(List& my_list){ my_list =原创 2021-08-23 20:11:37 · 898 阅读 · 2 评论