数据结构
重点是数据结构中图论、树的算法
云与尘呀?
这个作者很懒,什么都没留下…
展开
-
拓扑排序
拓扑排序是针对有向无环图的,当然也可以用它来检测到底有没有环,数据结构中学过其构成原理,这里就不再赘述,主要来讲他的实现。 分析原理,其实他的过程有点类似于层次遍历,所以用队列存储入度为0的点是OK的,但其实只要每次入队的结点入度为0,也没有顺序要求,栈也行,这里我为了避免每次比较麻烦,直接用优先队列实现。 #include<iostream> #include<vector&...原创 2020-03-09 09:13:15 · 114 阅读 · 0 评论 -
Bellman算法和SPFA算法
Dijkstra算法比较快速,但是如果遇到负边就无能为力了,而Bellman算法可以解决负边问题,只要不是负环。 这个算法数据结构没有讲过,他主要是每次对所以边进行松弛操作,进行n-1次得到最短路径。 其原理如下所述: 首先指出,图的任意一条最短路径既不能包含负权回路,也不会包含正权回路,因此它最多包含|n-1条边。 其次,从源点s可达的所有顶点如果存在最短路径,则这些最短路径构成一个以s为根的最...原创 2020-03-08 11:45:05 · 302 阅读 · 0 评论 -
最短路径之Dijkstra算法
Dijkstra算法有些类似于最小生成树中prim算法,从源点出发,每次选出一个最短路径,然后依次更新n次。 下面是代码实现 #include<iostream> #include<vector> #include<algorithm> using namespace std; const int maxv=101; const int inf=1000000...原创 2020-03-08 11:01:33 · 162 阅读 · 0 评论 -
最小生成树两种方法实现
在数据结构中我们知道最小生成树有两种实现方法,这两种方法一定要熟练,其中prim方法开了两个辅助数组vis[]和dis[];kruskal方法采用了并查集并可以和优先队列(也可以直接用sort排序)结合起来,下面是个人两种方法在邻接表中的实现代码: #include<iostream> #include<vector> #include<queue> usi...原创 2020-03-06 11:23:27 · 445 阅读 · 0 评论 -
平衡二叉树的实现
平衡二叉树是对排序二叉树的优化,在插入结点时有着很大的变化,需要调整树的高度达到平衡,下面是代码: #include<iostream> using namespace std; struct node{ int v,height; //height 记录高度 这里的高度是从下往上记 node *lchild,*rchild; }; node* newnode(int x){...原创 2020-03-02 16:40:37 · 127 阅读 · 0 评论 -
二叉排序树的建立、查找、插入、删除
如题,详情见下代码,基本类似于二叉树。 #include<iostream> using namespace std; struct node{ int data; node *lchild,*rchild; }; void search(node* root,int x) { // 查找 if(root==NULL){ //没有查到 printf("fail!...原创 2020-03-02 11:48:21 · 693 阅读 · 0 评论 -
树的遍历
如果要实现树的结构,按照前面的链表实现指针域需要开一个数组,可能比较麻烦,这里采用静态实现,又考虑到一个结点的孩子树不确定,用vector定义变长数组,最后结构如下: struct node{ datatype data; vector<int>child; }Node[maxn]; 如果遇到某些问题只需要树的结点不需要数据域,上述结构还可以直接用vector<in...原创 2020-03-01 15:44:46 · 80 阅读 · 0 评论 -
二叉树的遍历问题
二叉树的定义是用递归定义的,这样我们会发现在它在前中后遍历、甚至插入、建立程序中常常用到递归,实际上把握好了递归,也就把握好了二叉树的遍历问题。 下面是一些问题练习 1.从一个遍历(明确空树)中确定树 时间限制: 1 Sec 内存限制: 32 MB 提交: 312 解决: 186 [提交][状态][讨论版][命题人:外部导入] 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符...原创 2020-03-01 11:18:12 · 494 阅读 · 0 评论 -
二叉树的实现和四种遍历
#include<iostream> #include<queue> using namespace std; struct node{ int data; node *lchild,*rchild; int layer; //存放树的层次 }; node* newnode(int x){ //生成一个新结点 node* r=new node; r-...原创 2020-02-29 11:08:20 · 138 阅读 · 0 评论 -
广度优先搜索练习感想
广搜的定义在此不再赘述,特别的,它非常适宜于解决“最少”这种发问的问题,一般由队列实现,我在锻炼的过程中也有了一些感悟。 首先广搜的问题是由迷宫问题引出的,这里设置两个增量数组比较简洁,从这里开始我就注意到广搜的分支其实比较容易写,关键在于这些数据如何存储和如何判重,解决了这两个,可能问题就比较清晰,下面是一些实例。 引、矩阵找块 题目: 求01矩阵中,一个位置上下左右是为相邻,若若干个1相邻,它...原创 2020-02-26 17:02:47 · 437 阅读 · 1 评论 -
DFS深度优先搜索
深度优先搜索是搜索算法的一种。以数据结构中树的深度遍历为例,其沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。 观察上诉百度的定义,发现有两个特性,一个...原创 2020-02-24 19:09:03 · 105 阅读 · 0 评论 -
后缀表达式(栈,队列应用)
先看题目: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 在遇到这种模拟计算器的题目中,最常用的手段就是将中缀表达式转化为后缀表达式,再进...原创 2020-02-17 16:18:19 · 509 阅读 · 0 评论 -
并查集和路径压缩
并查集的功能基本上就在他名字里了。 并是指合并两个集合,查是指查找该元素属于哪个集合。 用我看过的一篇文章来描述每一个江湖门派就是一个集合,底下不管有多少帮众,他们的头的头…最终头头就是掌门人,并查集的查就是查掌门人,并就是并两个帮派。 用father[i]来表示i的父亲结点,若father[i]==i,它就是掌门人,很容易得出查的操作: int findfather(int k){ int ...原创 2020-02-14 17:27:15 · 164 阅读 · 0 评论