![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
挑战程序设计竞赛2 算法与数据结构
Peiwen123
Clear code
展开
-
ALDS1_7_D:Reconstruction of a Tree
输入:给出一个二叉树的前序遍历和中序遍历输出:输出一个二叉树的后序遍历题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_D思路:前序遍历从头开始遍历的时候,第一个元素是根元素,根据这个元素,找到它在中序遍历中的位置,可以确定的是,这个元素在中序遍历序列中的位置,前面的都是这个根的左子树,后面的都是...原创 2018-05-27 14:41:25 · 234 阅读 · 0 评论 -
ALDS1_12_C:Single Source Shortest Path II
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_12_C同ALDS1_12_C:Single Source Shortest Path I 中,用最小堆(优先级队列来实现)实现dijkstra算法思路: 要求一个图的单源最短路径,比如求0节点的单源最短路径,先把d[0]赋为0,对于优先级队列S(...原创 2018-06-14 22:53:56 · 292 阅读 · 0 评论 -
DSL_1_A:Disjoint Set: Union Find Tree 并查集
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_1_A有两种操作,unite和same,实现并查集的合并和查询操作。思路:用树形结构来描述并查集,用pre数组来表示当前节点的前缀节点(父节点),初始化时所有节点的pre节点都是自己本身,所以检查是否在同一并查集内的操作就是查询这两个节点的根节点是否相同;...原创 2018-06-17 13:21:00 · 219 阅读 · 0 评论 -
DSL_2_C:Range Search (kD Tree)
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_C题目给出了一些点的坐标,然后给出一个二维的矩形范围,判断哪些点在这个范围内;比如,给出一些二维点的坐标,然后求出1<=x<=5而且2<=y<=6的所有点;就是一个范围搜索的题目,需要用到KD Tree;就是k维树,在建立好kd...原创 2018-06-23 04:02:36 · 1844 阅读 · 1 评论 -
GRL_1_C:All Pairs Shortest Path
题目链接题目给出一个带权有向图,要求出这个图的每两个点之间的最短路径的距离。(v个顶点,e条边)要求在这个图中不能有负环(否则所有两点间的距离都可以通过这个环来无限减少,计算没有意义) 原始的思想是可以用dijkstra算法一次次去算每两个点之间的距离,但是这样很慢,而且不能直接检测负环。引入floyd算法,用动态规划的思想来做这道题。现在我们用A[k][i][j]来表示,...原创 2018-07-07 02:14:26 · 782 阅读 · 0 评论 -
GRL_4_B:Topological Sort
题目链接题目给出了一个无环有向图,不带权值,以此来表示一个工作流程,比如下面的第一个图,表示的意思是,要完成B任务,前置需要完成A任务和X任务,要完成Y任务,前置是要完成X任务,以此类推,目的是要找出一种合理的完成任务的顺序,来保证所有任务都可以被完成,有些任务是没有前置要求的,比如A,X,这些任务可以直接完成。思路有两种,bfs和dfs,我是用队列来实现的首先用邻接矩阵来存储这个...原创 2018-07-07 16:55:47 · 212 阅读 · 0 评论 -
GRL_3_A:Articulation Points
题目链接题目给出了一个无向有权连通图。定义关节点的概念:如果在一个连通图中,去掉某一个顶点和从这个顶点引出的所有边之后,剩下的其他节点不在同一个连通分量里,则称这个节点为关节点。题目给出一个图之后,要按顺序输出本图中的关节点。思路:基本思路是对dfs进行优化,在dfs的过程中定义一些数据:按照dfs的过程生成一个dfs tree记为T;pre[u] 用来存储u节点在df...原创 2018-07-08 17:11:37 · 730 阅读 · 0 评论 -
GRL_5_A:Diameter of a Tree 树的直径
题目链接题目给出了一个有权无向树T,要求出这棵树的直径(找出相距最远的两个点的距离)思路:1.先任取一个点s,先求出T中到s距离最远的点x;2.再求出T中到点x距离最远的点y,这就是题目所要求的直径距离。具体证明略,感性的理解就是,通过第一步为了找出一个附近权值比较大的叶子节点作为开始点,然后找到距离开始点最远的点,距离就是该树的直径。主要实现的部分是在【给出一个点x,求出...原创 2018-07-09 02:20:44 · 250 阅读 · 0 评论 -
GRL_2_A:Minimum Spanning Tree
题目链接题目给出一个有权无向图,要求出其最小生成树(输出最小生成树的各边权值之和);由于边数比较多,采用kruskal算法,存储的时候以边的形式存储;思路:1.先按权值给边从小到大排序;2.初始化并查集,所有点在不同集合内;3.从小到大开始选取边,如果该边的两个顶点在同一集合内,则跳过这个边;如果该边的两个顶点不在同一集合内,则将这条边加入到最小生成树中;(集合可以理解成子...原创 2018-07-09 19:08:36 · 300 阅读 · 0 评论 -
大白2--计算几何模版
#define EPS (1e-10)#define equals(a,b) (fabs((a) - (b)) < EPS)// 点类class Point {public : double x, y; Point() {}; Point(double x, double y) :x(x), y(y) {} Point operator + (...转载 2018-07-09 23:57:20 · 191 阅读 · 0 评论 -
平面几何常用算法 整理
1.定义先要定义一些用于计算的基本对象:点[Point],向量[Vector],线段[Segment],直线[Line],多边形[Polygon],圆[Circle]。可以想到:Point和Vector:点和向量可以看做是相同的,点也可以看做是自原点出发的向量;Segment和Line:线段和直线可以看做是相同的,都是由两个Point确定的一条线;Polygon:多边形可以看做...原创 2018-07-19 01:01:24 · 3967 阅读 · 0 评论 -
CGL_3_C:Polygon-Point Containment
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_3_C题目给出一个多边形,然后给出一个点,需要判断该点与多边形的关系: IN 2 //在多边形内 ON 1 //在多边形边上 OUT 0//在多边形内部基本思路是,先判断这个点是不是在多变形的边上,用类似于ccw的方法来判断;从这个点发出一条...原创 2018-07-20 15:48:15 · 282 阅读 · 0 评论 -
CGL_4_A:Convex Hull 凸包的andrew算法
题目链接题目给出一个多边形,要求出这个多边形的凸包;在一个点集D中,按一定顺序选取子集Q 使得Q中所有点顺次连接所构成的封闭凸多边形包住D中所有点可以形象地理解为:有许多个钉子钉在平面上,用一根牛皮筋把所有点包住 找出凸包的思路是:先把题目给出的多边形的点集合按x坐标从小到大排序,x相同的按y从小到大排序;(点的<前面已经重载过,符合这个要求)将排序后的集...原创 2018-07-21 00:31:54 · 388 阅读 · 0 评论 -
DPL_1_A:Coin Changing Problem [动态规划]
题目链接 现在给了m枚不同面值的硬币,要求用最少的硬币凑出n元钱,求出所需要的最少的硬币的数量; 用动态规划来做,现在用: dp[i][j]=xdp[i][j]=xdp[i][j]=x 表示现在用第1-i枚硬币,凑出价值为j的钱需要的最少的硬币数量为x; 可以想到: dp[i][j]=min(dp[i−1][j],dp[i][j−c[i]]+1)dp[i][j]=min(dp[i−1][...原创 2018-08-11 14:31:46 · 374 阅读 · 0 评论 -
DPL_1_B:0-1 Knapsack Problem [动态规划] 0-1背包问题
题目链接题目给出n个物品,物品的价值vi,质量为wi,现在要求出承重为w袋子能装下多少价值的物品,求出总价值;考虑对于每个物品都有装和不装两个选择,称之为0-1背包问题;用dp[i][j]dp[i][j]dp[i][j]来表示,只用第1-i个物品,承重不超过j的情况下,能获得的最大价值;可以获得递推关系: dp[i][j]=max(dp[i−1][j],dp[i−1][j−wei...原创 2018-08-11 23:28:03 · 335 阅读 · 0 评论 -
ALDS1_12_B:Single Source Shortest Path I
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_12_B以临界矩阵的形式给出一个有权图,要求出每个节点到顶点0的最短路径。使用dijkstra算法,思路如下: dijkstra算法初始化状态下将S置空。初始化s的d[s]=0,除s之外,所有属于V的顶点i的d[i]=∞循环进行下述处理,直到S=...原创 2018-06-14 00:30:22 · 242 阅读 · 0 评论 -
ALDS1_12_A:Minimum Spanning Tree 最小代价生成树
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_12_A以邻接矩阵的形式给一个有权图,求出这个图的最小代价生成树。使用prim算法的思想,复杂度只要求在n^2,不用优先队列来实现。思路:prim算法的思想是,对于一个有权图G,求它的MST (Minimum Spanning Tree) 设...原创 2018-06-10 19:37:48 · 324 阅读 · 0 评论 -
ALDS1_11_D:Connected Components
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_D给一些Social Network中的好友关系,然后求两者是不是好友(通过好友的好友也算是好友)比如1和2是好友,2和3是好友,那么1和3也算是好友思路:把每个人看作是一个节点,每个好友关系看做是一条边,是好友关系就表示二者是在同一个连通分量里,连...原创 2018-06-08 22:22:47 · 262 阅读 · 0 评论 -
ALDS1_8_A:Binary Search Tree I二叉搜索树的插入
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_8_A输入给的是insert和print命令,要求给出二叉树的前序遍历和中序遍历。代码如下:#include <cstdio>#include <iostream>#include <string>#incl...原创 2018-05-28 20:47:20 · 179 阅读 · 0 评论 -
ALDS1_8_B:Binary Search Tree II 二叉搜索树的查找
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_8_B输入一些命令 insert print find 代码如下:#include <cstdio>#include <iostream>#include <string>#include <alg...原创 2018-05-28 21:23:07 · 156 阅读 · 0 评论 -
ALDS1_8_C:Binary Search Tree III 二叉搜索树的删除
二叉搜索树的删除操作题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_8_C比之前面的两题,再加上删除的操作。现在假设已经有了一颗二叉搜索树,然后我想要删除一个节点z;那么有以下三种情况case 1: z没有子树,即z为叶子节点case 2: z只有一颗子树,即只有左子树或只有右子树c...原创 2018-05-30 00:02:25 · 303 阅读 · 0 评论 -
set , map and pair
#include <set>集合,包含的是无序集合,基本同数学中集合的概念,不存在重复元素。存在以下几种操作:insert(key);插入键值keyinsert(iterator_ first,iterator_last);插入迭代器在first和last之间的值;clear();size();begin();end();erase(key);f...原创 2018-05-30 01:19:39 · 133 阅读 · 0 评论 -
ALDS1_9_A:Complete Binary Tree
输入:一个按层输入的完全二叉树输出:每个节点的亲子关系因为是二叉树,可以直接用一位数组来存储,其中,对于节点i,它的父亲节点是i/2,i是偶数的时候节点是左孩子,奇数的时候节点是右孩子,它的左孩子是2*i,右孩子是2*i+1。注意:在数组中存储时,下标志从1开始。代码如下:#include <cstdio>#include <iostream>#i...原创 2018-05-31 00:13:21 · 187 阅读 · 0 评论 -
ALDS1_9_B: Maximum Heap
输入给一个完全二叉树,或者是一个近似完全二叉树,然后通过通过最大堆的性质,使之成为一个最大堆;我们从倒数第二层的节点开始遍历(叶子节点那一层不用遍历),对于每个节点,比较它的左右孩子节点和自身的值的大小,把最大的值作为根,然后从底至上地遍历这个树。当每次进行了swap操作之后,需要依次往下检查被交换的节点是否破坏了底层的节点的最大堆特性。代码如下:#include <cst...原创 2018-05-31 01:12:38 · 162 阅读 · 0 评论 -
ALDS1_9_C:Priority Queue
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_9_C结合上一题的最大堆,实现优先队列的功能:insert:插入元素extract:就是pop出顶端元素,即返回当前的最大元素并且删除它的功能。 插入:把元素往最后插,然后向上层遍历,寻找到正确的位置为止。(因为假设当前的堆已经是最大堆)删...原创 2018-05-31 02:20:44 · 197 阅读 · 0 评论 -
C++ priority_queue简述
priority_queue是优先级队列,在C++标准库中提供,提供了类似队列的功能,但是每次顶部元素都是队列中 优先级最高的元素。 priority_queue<class _Tp, _Container, _Compare> A; priority_queue的容器默认选择的是vector,priority_queue的优先级,对于int类型,默认是优先取大的...原创 2018-05-31 15:16:48 · 721 阅读 · 0 评论 -
ALDS1_10_A:Fibonacci Number
给出n,写出第n项斐波那切数列满足 fib(n)=fib(n-1)+fib(n-1),n=0或者1时fib(n)=1;使用dp记忆华递归,代码如下:#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int A[50];int fib(in...原创 2018-06-01 12:33:54 · 167 阅读 · 0 评论 -
ALDS1_10_C:Longest Common Subsequence LCS最长公共子序列
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_10_C给两个序列,找出最长公共子序列用dp[i][j]来表示:第一个串的第0-i位和第二个串的0-j位的最长公共子序列。运算时递归函数如下: $$dp[i+1]=\begin{cases}0 & i==0 \ ||\ j==0\\dp...原创 2018-06-01 16:46:17 · 195 阅读 · 0 评论 -
ALDS1_10_B:Matrix Chain Multiplication
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_10_B输入:一组矩阵的行和列输出:进行矩阵乘法所需的最少乘法次数 给定一个n个矩阵的序列〈A1,A2,A3...An〉〈A1,A2,A3...An〉我们要计算他们的乘积:A1A2A3...AnA1A2A3...An,由于矩阵乘法满足结合律,加括号...原创 2018-06-03 00:18:21 · 246 阅读 · 0 评论 -
ALDS1_11_A:Graph
输入以邻接表的方式给一个图,输出用邻接矩阵来表示这个图没啥好说的,代码如下:#include <cstdio>#include <cstdlib>#include <iostream>#include <cstring>#include <algorithm>using namespace std;bool A[1...原创 2018-06-03 20:23:46 · 247 阅读 · 0 评论 -
ALDS1_11_B:Depth First Search
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_B 邻接表的方式给一个图,输出对这个图进行dfs之后,每个节点的开始搜索和结束搜索时间。首先,如果我想做对一个邻接矩阵的深度优先遍历,dfs我需要用一个栈来存储,我需要访问的元素。首先把第一个节点放进去,然后按照顺序遍历一遍节点表...原创 2018-06-05 23:33:57 · 246 阅读 · 0 评论 -
ALDS1_11_C:Breadth First Search
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_C邻接表的方式给出一个图,对这个图进行bfs最终求出每个节点到顶点1的距离;思路:先把图转成邻接矩阵; 如果我想对一个邻接矩阵的图,做宽度优先搜索。首先把第一个节点1,放进Q队列;第一步取队列的第一个元素,把它pop出来,比如说是...原创 2018-06-06 23:25:26 · 217 阅读 · 0 评论 -
DPL_1_D:Longest Increasing Subsequence[贪心+二分][动态规划]
题目链接题目给出了n个数字,要求出这个n个数组组成的序列的最长上升子序列(longest increasing subsequence);首先容易想到的是dp的做法,想到用dp[i]dp[i]dp[i]来表示第1-n个数字组成的LIS的长度;那么可以得到递推式:dp[i]=max(dp[i−1],dp[j]+1)dp[i]=max(dp[i−1],dp[j]+1)dp[i]=max(d...原创 2018-08-12 02:22:49 · 371 阅读 · 0 评论 -
DPL_3_A:Largest Square [动态规划]
题目链接题目给出一个h*w的矩形,矩形中有些点是1,有些点是0; 问值为0的点能构成的最大正方形的面积是多大?假设dp[i][j]dp[i][j]dp[i][j]是从点(i,j)开始的左上角的i*j的矩形中,能构成的最大正方形的边长; 如果点(i,j)的值为0,那么可以得到递推关系: dp[i][j]=min(dp[i][j−1],dp[i−1][j],dp[i−1][j−1])dp...原创 2018-08-13 14:51:59 · 282 阅读 · 0 评论 -
[单调栈]牛客网 直方图内最大矩形
题目链接 题目给一个向量,里面存一个序列,表示一个直方图的各个元素高,要求出这个直方图中的最大矩形面积;构建一个递增的单调栈: [单调栈就是一个栈,栈底元素向栈头元素递增,新加入的元素如果小于栈顶元素,就把栈顶元素pop,直到栈顶元素小于新加入的元素] 我们使用这样的数据结构 pair&amp;amp;amp;amp;amp;amp;lt;int,int&amp;amp;amp;amp;amp;amp;gt;pair&amp;amp;amp;amp;原创 2018-08-14 17:18:49 · 539 阅读 · 0 评论 -
ALDS1_6_D:Minimum Cost Sort (置换群) 同POJ 3270-Cow Sorting
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_D输入:给一组wi,要把他们从大到小排序,每次交换wi和wj的cost是wi+wj输出:完成对wi的排序需要消耗的最小cost先引入一个置换群的概念:一个有限集合的一一变换叫做置换,一对对置换组成了置换群。对于一个集合a(a[1],a[2],a[3...原创 2018-05-24 21:05:42 · 322 阅读 · 0 评论 -
对称群与置换群 定义
我刚接触抽象代数的那段时间,一直在考虑一个问题,抽象代数有什么实际应用。后来听说,群在研究一些具有对称性质的对象时有奇效。于是我试着用群去描述一些简单的几何变换,发现确实如此。这就是我在置换那篇文章的最后让大家思考等边三角形变换的原因。如果大家在看群的定义时,回想一下集合 S={1,2,...n}S={1,2,...n} 上的所有置换,不难发现这些置换也能构成群。这个群被叫做对称群,记为 SnS...转载 2018-05-24 21:09:14 · 13972 阅读 · 2 评论 -
置换群 理解
http://blog.163.com/myq_952/blog/static/863906320110211731329/置换的概念是什么?一个有限集合的一一变换叫做置换,一对对置换组成了置换群。对于一个集合a(a[1],a[2],a[3]...a[n]) 通过置换可以变成 (b[a[1]],b[a[2]],b[a[3]]...b[a[n]]) b的作用就是置换(可以理解为某种函数的作用),...转载 2018-05-24 21:09:37 · 5781 阅读 · 0 评论 -
ALDS1_7_A:Rooted Trees
有根树的表达,题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_A思路:建立一个 左子右兄弟树 ; 每个节点中含有的属性是:struct node{ int num; int parent,left,right;//left is child, right is sibling};初始...原创 2018-05-25 17:30:26 · 292 阅读 · 2 评论 -
ALDS1_7_B:Binary Trees
二叉树的表达,题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_B思路:建立一个二叉树,每个节点如下:struct node { int parent,left,right;};parent存父节点,left和right分别存左孩子和右孩子。初始化全部属性都赋为NIL(-1)求深度的...原创 2018-05-26 03:13:49 · 219 阅读 · 4 评论