数据结构
文章平均质量分 61
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
POJ2387 Til the Cows Come Home(最短路径)
题意:输入一个图,给出每条边的权值,以1为起点,要求到n的最短路径。要点:今天学了一下最短路,有好多种算法,估计要做好长一段时间了。这题就是最简单的模板,就是稍微注意一下可能有重边。参考博客:点击打开链接 点击打开链接dijkstra算法:15365926Seasonal2387Accepted4164K63MSC++852B原创 2016-04-07 22:42:00 · 416 阅读 · 0 评论 -
非递归实现二叉树的各种遍历
逛知乎看到有人去微软面试遇到让白板写非递归的二叉树的中序遍历,自己想了一下,非递归基本上就是用栈模拟,其他还好,后序遍历比较难写。参考博客:点击打开链接#include#include#includeusing namespace std;typedef struct treenode{ char data; treenode *left,*right;}treen原创 2016-06-29 16:37:13 · 410 阅读 · 0 评论 -
将C语言的声明翻译成通俗语言——cdecl
《c专家编程》中的一个程序,可以将声明翻译为通俗语言,主要运用栈,挺难的,我自己是写不出的,照着书敲了一遍。#include#include#include#include#define MAXTOKENS 100#define MAXTOKENLEN 64enum type_tag {IDENTIFIER,QUALIFIER,TYPE};struct token{原创 2016-07-03 12:31:27 · 574 阅读 · 0 评论 -
POJ1840 Eqs(hash)
题意:已知a1,a2,a3,a4,a5,求a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0有几个解。要点:跟hash其实关系不大,主要是移项,求a1x13+ a2x23+ a3x33=a4x43+ a5x33,这样只要三次循环即可,注意数组负数下标要加一个标准值。15873510Seasonal1840Accepted4原创 2016-08-02 20:08:56 · 329 阅读 · 0 评论 -
POJ1971 Parallelogram Counting(hash)
题意:给出一系列点的坐标,要求能组成几个不同的平行四边形。要点:思路很简单,找两个点的中点组成哈希表即可,我用链表写不是超时就是超空间,看来ACM还是尽量别用指针,用数组模拟链表可过。15878931Seasonal1971Accepted36868K704MSC++1103B2016-08-03 10:01:39原创 2016-08-03 10:11:46 · 463 阅读 · 0 评论 -
POJ2186 Popular Cows(强连通分量)
题意:奶牛A觉得奶牛B流行,奶牛B觉得奶牛C流行,则奶牛A也觉得奶牛B流行,现在要统计被其他所有奶牛觉得流行的奶牛数量。要点:先求出强连通分量并缩成点,算出对应入度和出度,统计出度为0的奶牛数即可,一开始我是统计进度为cnt-1的,后来发现不行,因为16068699Seasonal2186Accepted1240K469MSC++1562原创 2016-09-09 11:05:06 · 456 阅读 · 0 评论 -
红黑树的实现
学了一下算法导论上的红黑树,这个数据结构基于二叉搜索树,二叉搜索树有一个缺点:如果数据以递增的顺序插入,得到的树深度就是n,进行操作就很不方便。红黑树就是在此基础上完善,自己可以自平衡,使两边始终保持接近,这样时间复杂度就降到O(lgn)。这个数据结构的确很难,插入和删除这两种操作非常复杂,自己按照书上给的伪代码实现了一下,思路是基本理清了,这种太复杂的数据结构想完全记住是不太现实的,能够掌握要点原创 2016-08-24 22:25:21 · 331 阅读 · 0 评论 -
POJ1270 Following Orders(拓扑排序+回溯)
题意:给出一些字母和这些字母之间的大小关系,要求输出所有满足大小的序列。要点:这题其实跟拓扑排序关系不是很大了,主要是输出所有序列比较麻烦,注意题目要求要输出所有的字母,也即是没有在大小关系中出现的字母可以插在任意位置上。我们可以这么想:所有当前入度为0的点可以作为起点,假设一个点的入度为3,说明它的前面起码有3个字母,每次dfs递归深度,寻找下一个入度为0的点,最后再回溯即可。原创 2016-09-27 20:08:14 · 582 阅读 · 0 评论 -
codeforces723E One-Way Reform(欧拉通路)
第一次打线上赛,1456分来着,感觉自己模拟题做的不怎么样,总是想复杂,而且写代码慢的要死,这套题说实话还算简单,但只A了两道,其他的题都很基础,这题欧拉通路我刚好不会,所以写一下。题意:n个城市之间m条双向道路,现在把双向道路变成单向,求让出入度相同的城市最多的路线图。要点:这题就是个欧拉通路问题,因为要把双向变成单向,所以原本的出度如果是奇数,说明这个顶点的入度和出度不相等,原原创 2016-10-06 12:06:02 · 425 阅读 · 0 评论 -
HDU3401 Trade(单调队列优化DP)
最近做CF的时候遇到单调队列优化DP的问题,看了一下网上这种题也很少,而且都很难理解,下面是两个解释的比较好的博客:单调队列优化DP的基本思路:点击打开链接两道例题详解:点击打开链接下面讲一下我自己对单调队列优化dp的理解,首先不是所有dp都可以使用单调队列优化的,只有形如 dp[i]=max/min (f[k]) + g[i] (k还是挺难理解的,现在水平可能不够吧,还是多做题。原创 2016-11-19 15:06:29 · 392 阅读 · 0 评论 -
codeforces712E Memory and Casinos(区间树)
题意:有n个赌场,你在i赌场时,有pi的概率走到i+1,有1−pi的概率走到i−1.保证任何时候pi≤pi+1有q次操作,修改一个赌场的p值;或者询问[l,r]表示从第l个赌场走到r的概率,他在走的过程中不会离开区间[l,r].要点:比较容易看出是区间树,但是这个概率的处理很复杂,基本思路可以参考下面这个博客:参考博客:点击打开链接但是这个博客还有网上我找了一下,有一个原创 2016-11-25 21:50:58 · 347 阅读 · 0 评论 -
POJ2823 Sliding Window(单调队列)
题意:给一列数,用一个长度为k的区间在这列区间上从左到右移动,求出每个区间中的最大值和最小值。要点:单调队列,主要应用是存储最值,每次找最值只要看队头即可,否则每次都要遍历一次肯定超时。其实直接考单调队列的地方不多,主要是用它优化一些DP什么的。这题主要是注意一下因为区间更新,有时候队头会不在区间内,所以每次都要更新队头。参考博客:点击打开链接手造单调队列:原创 2016-04-19 22:02:25 · 298 阅读 · 0 评论 -
习题6-3 UVa536 Tree Recovery(树的遍历转换)
题意:给出先序和中序求后序要点:递归完成,只要注意一下边界就可以了,水题#include#include#includechar s1[30], s2[30];char tree[30];int count;void build(int l1, int r1,int l2,int r2){ if (l1 > r1) return; //空树 int p原创 2016-03-06 09:31:38 · 602 阅读 · 0 评论 -
POJ2377 Bad Cowtractors(最大生成树)
题意:连接农场,要求输出最大权值和并且不能连成环,如果不能全部连接,输出-1要点;就是最小生成树变成最大罢了,Kruskal算法,排序改成从大到小,一次AC。15347152Seasonal2377Accepted412K63MSC++881B2016-04-03 13:27:46#include#inclu原创 2016-04-03 14:00:51 · 350 阅读 · 0 评论 -
POJ2395 Out of Hay(最小生成树)
题意:农场之间相互连接,要求输出最小连通中最长的那条边的权值要点:又是一道模板题,POJ上最小生成树咋这么多水题,要做点难的啊。15347115Seasonal2395Accepted292K79MSC++892B2016-04-03 13:07:56#include#include#inclu原创 2016-04-03 13:10:44 · 456 阅读 · 0 评论 -
POJ1861 Network(最小生成树)
题意:有n个顶点,m条边,每条边双向的,并且有一定的长度,现在要求使每个顶点连通起来,并且使总长度最短输出最大边,和边的总数,还有是这些边的情况输出要点:这破题,special judge给的输出例子是错的,导致我先用prim算法搞了一个小时还是WA,怒换Kruskal算法10分钟AC了。不过用这题也算理解了special judge的意思,就是有很多种正确输出,只要选一种输出就行原创 2016-04-03 10:48:43 · 367 阅读 · 0 评论 -
POJ1287 Networking(最小生成树)
题意:连通一个图,找最小权值和,有重边要点:因为有重边,所以Prim算法还要取最小的边加入,而Kruskal算法可以直接忽略这个问题,因为一开始要排序,大的自动舍掉了。这题很水,但我WA了快1个小时,原因init函数中,因为我是从0开始到n-1的,这题因为卡的比较紧,数据是从1~n的,所以这里少了一个数值一直WA,以后要注意这个地方。15345730Se原创 2016-04-02 20:56:23 · 343 阅读 · 0 评论 -
POJ1258 Agri-Net(最小生成树)
题意:市长要将每个村庄都连通起来,要求村庄之间路的总和最短要点:学了一下最小生成树,目前只会Kruskal算法,这个算法的基本思路是先按边的权值,从小到大排列,然后每次将边的起点和终点放进集合中,直至所有节点都在一个连通分量中。既然是连通分量,那就正好可以用刚学的并查集。如果这条边的两个节点通过find发现相同了,说明这两个已经在集合中了。最后并查集也可以看成一棵树,与我前面做过的一道原创 2016-03-31 22:21:22 · 488 阅读 · 0 评论 -
POJ2485 Highways(最小生成树)
题意:城市之间建高速公路,要求在能连通的情况下找出最小生成树最大的边要点:最小生成树,这题我学了一下prim算法。这个算法的要点是用点遍历,关键之处在于建立一个不断更新的low数组,这个数组记录生成树的过程中能接触到的对应最小权值。每次先随便选一个顶点作为起点,然后存入low数组,寻找一次当前权值后,集合中顶点的数目增加,能接触到的边改变,所以更新low数组。 Prim算法:...原创 2016-04-01 19:44:12 · 424 阅读 · 0 评论 -
POJ3250 Bad Hair Day(单调栈)
题意:给出一列牛的高度,所有牛只能往右看,且只能看到高度比自己低的牛的发型,并且如果出现高度大于自己的牛,后面的牛就再也看不到了,求所有牛能看到其他牛的发型总和。要点:刚刚教了单调栈和单调队列,虽然原理了解了,但是还是无法很好的转化,这就需要练习了。这题主要是看到牛的总数与被看到的牛的数量是相等的,所以直接用单调递减栈,当前数与单调栈内的所有数比较,遍历弹出一遍后剩下的数就是能看到自己原创 2016-04-17 09:51:24 · 359 阅读 · 0 评论 -
POJ2559 Largest Rectangle in a Histogram(单调栈)
题意:给出一组矩形的高,求最多能拼成矩形的最大面积,看图就很清楚了。要点:还是单调栈,现在有点感觉了,单调栈大概就是能求出当前值左右的比它大或小的数的范围。这题用高度作为单调栈,分别往左右找比当前高度大的数的范围,最后求个面积即可。15402130Seasonal2559Accepted1440K157MSC++823B201原创 2016-04-17 11:17:59 · 399 阅读 · 0 评论 -
POJ2796 Feel Good(单调栈)
题意:给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值要点:还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可,我看不太懂,还是自己写了一个往两侧寻找边界的,比较好理解,注意这题可以开一个sum数组存储第i个数据前的和,这样降低了复杂度,这是一个比较方便的技巧,注意sum数组也要设成long long型,原创 2016-04-17 14:24:18 · 539 阅读 · 0 评论 -
HDU 2255 奔小康赚大钱 (二分图:KM算法)
题意:中文题不解释要点:KM算法是求完备匹配下的最大权匹配: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接X[i]Y[j]有权w[i][j],求一种匹配使得所有w[i][j]的和最大。注意完备匹配定义:|X|=|Y|=匹配数。这算法还是比较难的,证明我还是半懂不懂的,具体流程还是可以的。基本上就是利用增广路,不断修改点标,找可行边什么的。参考博客:点击打开链接这题原创 2016-05-12 15:42:19 · 372 阅读 · 0 评论 -
HDU1166 敌兵布阵(线段树)
题意:中文题要点:就是一个单点更新的线段树问题,之前一直用线状数组,现在学了一下线段树,这两个能处理的问题都差不多,线段树好理解一些,基本就是存储将一个区间不断二分,形成一个树,方便查询和更新。#include#include#includeusing namespace std;const int N = 50000 + 5;int sum[N << 2];int原创 2016-10-15 16:12:10 · 297 阅读 · 0 评论 -
UVa11324 The Largest Clique(强连通分量+DP)
题意:看白书要点:求出强连通分量后缩成点,内部点数作为权,进行DAG的DP。#include#include#include#include#includeusing namespace std;const int maxn=1010;vector g[maxn],map[maxn];int dfn[maxn],lowlink[maxn],sccno[maxn],d原创 2016-09-15 19:44:24 · 334 阅读 · 0 评论 -
PAT1066 Root of AVL Tree (25)(AVL树)
题意:给出一系列要插入平衡搜索二叉树的数,要求输出最后的根节点思路:没其他办法,完完全全是AVL树的插入节点模拟,这题就不会写,看别人代码写的。#include<iostream>#include<algorithm>using namespace std;struct node { int key; struct node *left, *right;};...原创 2018-05-29 18:55:46 · 194 阅读 · 0 评论 -
PAT1086 Tree Traversals Again (25)(树的遍历)
题意:用栈的形式给出一棵树建立的顺序,要求输出后序遍历思路:push的顺序就是先序遍历,pop出的顺序就是中序遍历,所以直接用二叉树先序和中序遍历转后序即可。主要记录一下模板#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;const int maxn = 10000;vector...原创 2018-06-18 10:14:08 · 178 阅读 · 0 评论 -
PAT1143 Lowest Common Ancestor(BST)
题意:给出一棵二叉搜索树的前序遍历,问结点u和v的共同最低祖先是谁思路:这题我一开始的思路是建树,顺便建立前驱关系,然后就写,写完超时两个案例。正确思路是如果当前结点值在[u,v]之间,就说明该点为最低公共祖先,这个地方没想到,下面是别人的代码,非常简单,都不用建树。#include<iostream>#include<algorithm>#include<vec...原创 2018-07-14 23:16:36 · 316 阅读 · 0 评论 -
1110 Complete Binary Tree(完全二叉树)
题意:给出一个n表示有n个结点,这n个结点为0~n-1,给出这n个结点的左右孩子,求问这棵树是不是完全二叉树思路:这题就是先建树,找出根结点然后层序遍历,我一开始是把每层的结点数存储下来看是否等于2^i,结果有两个案例没过,看别人的代码有更好的方法,就是记录遍历的个数cnt,如果遇到空结点并且(cnt==n)那就是完全二叉树,如果(cnt!=n)那就不是完全二叉树。注意会存在一开始cn...原创 2018-07-26 13:06:00 · 345 阅读 · 0 评论 -
PAT1135 Is It A Red-Black Tree(红黑树)
题意:给出一棵平衡二叉搜索树的先序序列,要求判断是否为红黑树思路:这题一开始我没意识到红黑树都是平衡二叉搜索树,知道后就先按照先序和中序建树,然后按照红黑树的定义,用递归判断每个节点的左右黑节点的个数即可#include <bits/stdc++.h>using namespace std;const int maxn=50;int pre[maxn],in[m...原创 2018-08-03 22:01:52 · 304 阅读 · 0 评论 -
PAT1138 Postorder Traversal(树的遍历)
题意:给定一棵书的先序遍历和后序遍历,然后找出这棵树后序遍历的第一个元素思路:这题的思路很简单,考虑到只要输出第一个元素,所以若有左子树就递归左子树,如果没有左子树,才找右子树。但这题有个点很怪,都是同样的方法我的代码就超时,找了网上别人写的有的能过有的不能过,下面是一个能过的。我看了一下好像PAT是支持#include <bits/stdc++.h>的,下次可以直接用。...原创 2018-07-31 19:55:24 · 242 阅读 · 0 评论 -
PAT1119 Pre- and Post-order Traversals(先序后序求中序)
题意:给出先序和后序,要求如果能形成唯一的树就输出yes和中序,如果不能就输出no和任意一个中序思路:这题就是递归建树,根据后序中倒数第二个数到先序中寻找对应的位置,如果后序的倒数第二个数和先序的第二个数相同就说明不唯一,此时选择将其作为右子树。我这题写的时候考虑复杂了,想着同时用先序的第二个数和后序的倒数第二个数去拆分树,实际上只要选择其中一个就行,然后递归的时候如果不唯一,只有一个...原创 2018-08-15 20:21:31 · 316 阅读 · 0 评论 -
PAT1130 Infix Expression(树的递归)
题意:给出一棵符号树,要求加上括号输出正确的序列思路:这题一开始没想出来,不知道括号该怎么插入,实际上只要根节点和叶子节点不插入括号,其他的按中序正常插入即可。#include<bits/stdc++.h>using namespace std;struct node{ string key; int left,right;}tree[30];...原创 2018-08-29 18:27:45 · 231 阅读 · 0 评论 -
PAT1123 Is It a Complete AVL Tree(AVL树&&完全二叉树)
题意:给出一系列数,要求组成AVL树,最后层序输出,并且判断是否为一个完全二叉树要点:这题就是一个AVL树的插入和判断完全二叉树,之前分别都有出现过,AVL树的建立需要记忆。#include<bits/stdc++.h>using namespace std;int cnt=0,n;bool flag,vis;vector<int> ans;s...原创 2018-08-25 17:03:55 · 311 阅读 · 0 评论 -
层序中序生成树
已知层序和中序也可以唯一确定一棵树,构建树的思路是遍历层序在中序中寻找优先输出根结点的位置,并递归建树,每次递归层序的范围不改变。#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;int level[maxn],in[maxn];struct node{ int key; no...原创 2018-08-30 12:13:35 · 838 阅读 · 0 评论 -
PAT1064 Complete Binary Search Tree (30)(BST)
题意:给出一个完全二叉搜索树的键值序列,要求输出层序输出要点:完全二叉搜索树的根节点是可以唯一确定的,所以一开始排序一下,再用dfs即可。这题我思路是想到了,但是生成根节点的地方写的有点问题,然后要输出层序是可以用dfs中序遍历再加一个数组直接输出的,这里可以学习一下。#include<iostream>#include<string>#include<vecto...原创 2018-05-27 20:54:46 · 225 阅读 · 0 评论 -
PAT1051. Pop Sequence (25)(栈模拟)
题意:有个容量限制为m的栈,分别把1,2,3,…,n入栈,给出一个系列出栈顺序,问这些出栈顺序是否可能.思路:我的思路是将出栈顺序一个个入栈,如果当前栈顶等于此时入栈的元素说明正确,如果小于就继续入栈到该元素为止,如果小于说明出栈顺序有错,其中判断一下栈的元素个数是否大于m。过是过了但是感觉写的不太好,看了一下网上的代码思路比我的要清晰很多,所以还是记录一下,这个问题可以用来判断出栈顺序是否正确,...原创 2018-05-05 20:35:02 · 212 阅读 · 0 评论 -
POJ1236 Network of Schools(强连通分量:Tarjan算法)
题意:学校之间有网络系统,通过网络可以从一个学校定向的传递文件给另一个学校。现在问最少给几个学校传递文件使所有学校都能收到?最少添加几天网络边可以使整个网络连通?要点:就是一个基本的强连通分量,将连通分量缩成一个点,入度和出度如果都不为0说明这个点与其他点连通,所以第一问我们只要算出几个点入度为0即可,第二问我们只要算出几个点入度为0,几个点出度为0,取其中最大值即可。理解一下就是,我原创 2016-09-09 09:32:32 · 468 阅读 · 0 评论 -
强连通分量
笔记本的独显坏了,在图书馆打的,真是痛苦。写个最基本的算法写了2个小时。神船真是半年包烂,不玩游戏还是别上船了。有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通原创 2016-09-06 16:05:57 · 425 阅读 · 0 评论 -
POJ2155 Matrix(经典二维树状数组)
题意:给出一个矩阵,其中的元素要么是0要么是1,现在有两种操作,一种是将一个子矩阵内的元素全部反转,一种是查询元素(x,y)对应的值。要点:这题是非常经典的一道二维树状数组题,难点是怎么修改子矩阵内的值,其实只要每次修改(x1,y1),(x1,y2+1),{x2+1,y1},(x2+1,y2+1)这四个点的值即可。主要思路可以参考这个论文:点击打开链接这个论文里有点说的不是很清原创 2016-08-31 10:53:51 · 489 阅读 · 0 评论