数据结构和算法
数据结构和算法
__zzz__
做有理想,有本领,有担当的青年一代
展开
-
并查集(一)
入门:http://acm.hdu.edu.cn/showproblem.php?pid=1232题目告诉你一共有n个城市,m条道路,下面是有m行,每一行表示有两个城市是连通的,问最少还需要建设多少条路所有的城市才可以连通起来。图论中的知识:顶点的连通性:在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也一定有路径),则称vi和vj是连通的。连通图:在无向图G中,若V(...原创 2019-04-13 18:38:29 · 219 阅读 · 0 评论 -
拓扑排序
拓扑排序拓扑排序:对于任何有向图而言,其拓扑排序为其所有结点的一个线性排序(对于同一个有向图而言可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。拓扑排序存在的前提:当且仅当一个有向图为有向无环图(directed acyclic graph,或称DAG)时,才能得到对应于该图的拓...原创 2019-03-23 16:35:42 · 356 阅读 · 1 评论 -
【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
Bellman-Ford算法Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高。而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编程难度上都比其他算法有优势。Bellman-Ford算法流程分为三个阶段: 第一步:数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为INF, Dis...原创 2019-02-03 07:58:43 · 483 阅读 · 0 评论 -
【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)
最短路径问题是图论中很重要的问题。解决最短路径几个经典的算法1、Dijkstra算法单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法。2、bellman-ford算法例题:【ACM】POJ 3259 Wormholes允许负权边的单源最短路径算法优点:可以发现负圈。缺点,时间复杂度比Dijkstra算法高。算法流程:...原创 2019-02-01 20:08:53 · 479 阅读 · 1 评论 -
【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结
动态管理集合的数据结构——二叉搜索树搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列。二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树。(1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。(2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。(3)它的左、右子树本身又各是一棵二叉排序树。对于二叉排序树...原创 2019-01-23 22:33:15 · 518 阅读 · 0 评论 -
【ACM】 multiset 的 一些应用
一、The kth great number题目链接:https://vjudge.net/problem/HDU-4006用set写超时 (在VJ里,用C++显示Compilation Error,选择G++,则是TLE)#include <iostream>#include <set>#include <cstdio>#include &...原创 2019-01-20 00:08:21 · 381 阅读 · 0 评论 -
【ACM】树 小结
树是一种表达层级结构的数据结构,也是实现高效算法与数据结构的基础。学习之前的基础:数组,循环处理,结构体,递归函数。树:由结点(node)和连接结点的边(edge)构成。 一、树的相关基本概念:双亲(父母/前件),子女(孩子/后件),双亲和子女的关系是相对而言的。兄弟:若几个结点的双亲为同一个结点,则这些结点互称为兄弟。祖先:将从树根到某一结点K的路...原创 2019-01-19 16:06:54 · 771 阅读 · 2 评论 -
【ACM】Doubly Linked List(STL list)
题目链接:https://vjudge.net/problem/Aizu-ALDS1_3_C这一题一开始的时候想的是用vector,超时#include <iostream>#include <stack>#include <cstdio>#include <cstring>#include <queue>#inclu...原创 2019-01-19 10:32:50 · 235 阅读 · 0 评论 -
【ACM】【STL】stack应用
C++ Stacks(堆栈)C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素 ...原创 2019-01-01 16:27:28 · 290 阅读 · 0 评论 -
【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)
Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径)。下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比。算法的基本思想:把图中的定点分成两组,第一组包括已确定最短路径的顶点,初始时只含有一个源点,记为集合S;第二组包括尚未确定的最短路径的顶点,记为V-S;按最短路径长度递增的顺序逐个把V-S中的顶点加到S中去,直至从v0出发可以到...原创 2018-12-23 03:28:57 · 1010 阅读 · 0 评论 -
【ACM】与全排列相关的STL函数 prev_permutation next_permutation
排列 与 全排列从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。如果这组数有n个,那么全排列数为n!个。对于全排列的求解可以使用递归,这里介绍几个方便的函数(),得到全排列。对于序列{ 'a' , 'b' , 'c' }(之后为了方便,不打单引号,嘻嘻),每一个元素都比后面的小,按照字...原创 2018-12-20 19:23:24 · 295 阅读 · 0 评论 -
字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)
字符串的模式匹配寻找字符串p在字符串t中首次出现的起始位置字符串的顺序存储typedef struct{ char str[MAXSIZE]; int length;}seqstring;朴素的模式匹配算法基本思想:用p中的每一个字符去与t中的字符一一比较。模式p 正文 t如果匹配成功,则返回p在t中首次出现的起始位置如果匹配不成功则返回-1最坏情况比...原创 2018-12-19 17:10:12 · 2345 阅读 · 2 评论 -
【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法
主函数自行添加头文件 + 宏定义#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100串的顺序存储typedef struct{ char str[MAXSIZE]; int length;}seqstring;顺序串的创建void creat(seqstring *S){...原创 2018-12-18 19:45:49 · 9786 阅读 · 3 评论 -
【数据结构】双链表的应用
1、设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点,即使得值为x的新结点成为值为y的结点的前驱结点。2、设计一个算法,将一个双链表改建成一个循环双链表。#include <stdio.h>#include <stdlib.h>typedef struct dlink_node{ int info; struct dlink_node *...原创 2018-12-18 16:35:31 · 1281 阅读 · 1 评论 -
【数据结构】判断一个单链表中各结点的值是否有序
count记录的是单链表的总长count1记录的是升序的结点的个数count2记录的是降序的结点的个数如果count1或者count2等于count,那么就说明该序列是升序或者降序的。稍加改进可以在准确判断是升序还是降序还是无序 (个人认为链表中只有一个结点或者没有结点都是有序的)#include <stdio.h>#include <stdlib.h...原创 2018-12-18 09:53:31 · 6056 阅读 · 1 评论 -
【数据结构】顺序表的应用(4)(C语言)
【数据结构】顺序表的应用(1)(C语言)【数据结构】顺序表的应用(2)(C语言)【数据结构】顺序表的应用(3)(C语言)设计一个算法,将一个顺序表倒置,即如果顺序表各个节点值存储在一维数组a中,倒置的结果是使得数组a中的a[0]等于原来的最后一个元素,a[1]等于原来的倒数第2个元素,......,a的最后一个元素等于原来的第一个元素。#include <stdio.h&g...原创 2018-12-17 20:11:23 · 1557 阅读 · 1 评论 -
【数据结构】顺序循环队列及其实现(C语言)
给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置。为了有效地利用空间,引入循环队列(环状)。在循环队列中,如果队列中最后一个结点存放在数组的最后一个元素位置,而数组前面有空位置的话,则下次在进行插入操作时,将插入到数组最前面那个元素的位置。其他情况下的插入操作和一般的...原创 2018-12-17 11:34:20 · 1240 阅读 · 0 评论 -
判定素数模板
int isprime(int num){ if(num==2 || num==3) return 1; if(num%6!=1 && num%6!=5) return 0; int t=sqrt((double)num); for(int i=5;i<=t;i+=6) { if(num%i==0 || num%(i+2)==0) return...原创 2018-12-08 20:13:02 · 161 阅读 · 0 评论 -
【数据结构】关键路径
在有向图中,如果用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间,这样的活动称为边表示活动的网,简称AOE网(Activity On Edge)。通常可以用AOE网来估算工程的完成时间,他不仅表达了工程中各事件的先后关系,更可说明整个工程至少需要多少时间完成以及哪些活动是影响工程进度的关键活动。在AOE网中:源点:一个入度为零的事件汇点:一个出度为零的事件由于一个AOE网中...原创 2018-12-04 22:20:55 · 419 阅读 · 0 评论 -
【数据结构】拓扑排序
如果一个有向图中没有包含简单的回路,这样的图为有向无环图。图中的顶点代表事件(活动),图中的有向边说明了事件之间的先后关系。这种用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动的网,简称AOV网(Active On Vertex Network)。在AOV网中,若顶点u与顶点v之间存在一条有向边<u,v>,则说明事件u必须先于事件v完成。此处将u称为v的直接前...原创 2018-12-04 20:06:44 · 313 阅读 · 0 评论 -
【数据结构】所有顶点对的最短路径 Floyd算法
所有顶点对的最短路径问题是指:对于给定的有向图G=(V,E),求任意一对顶点之间的最短路径。可以求解得到的 的递推公式:#include <stdio.h>#include <stdlib.h>const int FINITY = 5000;const int M = 20;typedef struct { char vex[M]; int...原创 2018-11-29 13:52:54 · 1023 阅读 · 0 评论 -
【数据结构】单链表的逆序输出(两种方法)
第一种方法:转换指针方向即:将一个已经创建好的单链表进行指针域的改变今天突然被问到单链表逆序的问题,弄了好久才看出别人的程序有啥问题,就重新写了一遍。今天才在CSDN客户端上看到美团的面试题是冒泡排序。一个看似简单的问题难倒很多人,所以简单的不要因为他简单就忽视它,人们在简单的问题上越容易犯错!!!!#include <stdio.h>#include &l...原创 2018-11-28 21:18:36 · 9215 阅读 · 0 评论 -
【数据结构】最小生成树 Prim算法 Kruskal算法
最小生成树应用场景:假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来。假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起来。更为实际的场景,在某地分布着N个村庄,现在需要在N个村庄之间修路,每个村庄之间的距离不同,问怎么修最短的路把村庄连接起来。 选定一个开始的结点,在一个点集合中,其余点在另一个点集合中...原创 2018-11-24 20:05:12 · 492 阅读 · 0 评论 -
【算法导论】【ACM】归并排序总结
许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关地若干子问题。这些算法典型的遵循分治法地思想:将原问题分解成几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。分治模式在每层递归时都有三个步骤:分解原问题为若干子问题,这些子问题是原问题规模较小的实例。 解决这些子问题,递归地求解各子问题。...原创 2018-11-24 20:00:23 · 294 阅读 · 0 评论 -
【排序】快速排序 && 选择排序 && sort() 比较
#include <iostream>#include <cstdio>#include <algorithm>#include <ctime>#include <cstdlib>using namespace std;const int maxn = 10000;int a[maxn],b[maxn],c[maxn];...原创 2018-11-21 13:13:21 · 216 阅读 · 0 评论 -
【数据结构】图的深度优先遍历 广度优先遍历
文件操作比直接输入方便许多#include <stdio.h>#include <stdlib.h>#include <string.h>#define M 20 /*邻接表的储存结构*/typedef struct node /*表结点 或者 边表结点*/{ int adjvex; struct node *next;}edgeno...原创 2018-11-20 21:35:52 · 909 阅读 · 0 评论 -
【数据结构】邻接表的储存结构 建立图的邻接表算法
【数据结构】邻接矩阵及其实现一个图的邻接矩阵的表示是唯一的,但其邻接表表示不唯一,这是因为在邻接表结构中,各便表结点的链接次序取决于建立邻接表时的算法以及输入的次序。一般而言邻接矩阵适合存储稠密图,邻接表适合存储稀疏图。直接输入: #include <stdio.h>#include <stdlib.h>#define M 20 /*邻接表的储存结...原创 2018-11-20 14:02:45 · 4479 阅读 · 0 评论 -
【数据结构】邻接矩阵及其实现
文件操作比直接输入方便很多直接输入://建立图的邻接矩阵储存结构#include <stdio.h>#include <string.h>#define M 20#define FINITY 5000 typedef struct { char vexs[M]; int edge[M][M]; int n,e; }Mgraph;//c=0,...原创 2018-11-20 13:01:00 · 1243 阅读 · 0 评论 -
【数据结构】二叉树的应用。
1、分别采用递归和非递归的方式编写两个函数,求一棵给定二叉树中叶子节点的个数2、返回一棵给定二叉树在中序遍历下的最后一个结点3、假设二叉树采用链式方式存储,root为其根节点,p和q分别指向二叉树中任意两个结点,编写一个函数,返回p和q最近的共同祖先。 在第三小题中采用递归:思想:1.判断root是不是NULL如果root为NULL,那么就无所谓祖先节点,直接返回NULL就好了...原创 2018-11-16 19:11:42 · 1006 阅读 · 0 评论 -
【ACM】CODE[VS] 2806(DFS)
感觉有点入了DFS的门槛,距离完全掌握还差得远呢AC代码:运行时间为7ms#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 26;int vis[maxn][maxn],col,line,flag,count;...原创 2018-11-07 21:43:45 · 111 阅读 · 0 评论 -
【ACM】CODE[VS] 1215 (DFS)
题目描述 Description在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。输入描述 Input Description输入的第一行为一个整数m,表示迷宫的数量。 其后每个迷宫数据的第一行为一个整数n(n≤16),表示...原创 2018-11-07 20:55:00 · 146 阅读 · 0 评论 -
【ACM】DFS & 全排列 & 回溯
深入体会一下DFS,回溯在一些OJ上endl和“\n”还是有区别的!!!题目链接:http://codevs.cn/problem/1294/方法一:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100...原创 2018-11-07 20:02:49 · 176 阅读 · 0 评论 -
【数据结构】二叉树及其相关操作
二叉树的定义二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成。二叉树并非一般的树形结构的特殊形式,它们是两种不同的数据结构。二叉树与一般树形结构的主要区别在于二叉树中每个非空结点最多只有两个子女,而一般的树形结构中每个非空结点可以有0到多个子女 二叉树中结点的子树要区分左子树和右子树,即是在结点只有...原创 2018-11-05 20:11:42 · 667 阅读 · 0 评论 -
【ACM】纸牌搭建
【题目】现有N张扑克牌,最多可以搭建几层【题目分析】找到通项公式 f[ i ]=f[ i-1 ]+3*i-1。先打出表,再二分搜索。不断缩小范围。 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace s...原创 2018-11-01 20:13:43 · 1017 阅读 · 0 评论 -
【ACM】删数问题(待更)
【描述】键盘输入一个正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S寻找一种方案使得剩下的数字组成的新数最小。(N不超过240位,N>S)【输入】两行,第一行:正整数N;第二行:正整数S。【输出】n去掉的s个数字后组成的新的正整数m。【样例输入】12300621230063【样例输出】10066 ...原创 2018-11-01 19:00:47 · 571 阅读 · 0 评论 -
【ACM】连续出现的字符
【描述】给定一个字符串,在字符串中找到第一个连续出现k次的字符【输入】第一行包含一个正整数k,表示至少需要连续出现的次数。1<=k<=1000。第二行包含需要查找的字符串。字符串的长度在1到1000之间,且不包含任何空白字符。【输出】若存在连续出现至少k次的字符,输出该字符;否则输出No。【样例输入】3abcccaaab【样例输出】c //给定...原创 2018-11-01 18:39:33 · 1306 阅读 · 0 评论 -
【ACM】图像旋转
逆时针//图像旋转#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;int main (){ int a[105][105]; int m,n,i,j; while(scanf("%d%d...原创 2018-11-01 13:11:52 · 233 阅读 · 0 评论 -
【ACM】魔方矩阵
输出魔方矩阵1、将1放在第一行中间一列; 2、从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1; 3、如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1; 4、当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列; 5、如果按上面规则确...原创 2018-10-31 18:33:23 · 777 阅读 · 0 评论 -
【算法导论】冒泡排序 && 选择排序
冒泡排序://从大到小 void bubble_sort(int array[],int len){ int i,j,t; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(array[j]<array[j+1]) { t=array[j];array[j]=array[j+1];ar...原创 2018-10-28 15:36:39 · 232 阅读 · 0 评论 -
【算法导论】插入排序
循环不变式在数学上阐述了通过循环(迭代,递归)去计算一个累计的目标值的正确性。关于循环不变式,我们必须要证明三条性质:初始化:循环第一次迭代之前,它为真。 保持:如果循环的某次迭代之前它为真,那么下次迭代之前仍为真。 终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。插入排序使用了增量方法:在排序子数组A[1,...,j-1]后,将单个元素A[ ...原创 2018-10-27 23:20:06 · 176 阅读 · 0 评论