
HDOJ结题报告
WellerZhao
熟练掌握C/C++、objective-c、java开发语言,专注于移动开发。
展开
-
解题报告-HDOJ-1233(最小生成树——kruskal)
之前我写过一个最小生成树的prim算法,当时我说过还有另一种求最小生成树的算法,那就是今天要说的——克鲁斯卡尔,如果想学习普林姆的可以翻看我前面写的博客文章http://blog.youkuaiyun.com/monkey0le/article/details/7725547。前面说过,prim算法的思想是把点加入到另一个集合中,而kruskal恰好相反,它的思想很简单,不断找最小的边加入进去,并且保证加原创 2012-09-16 20:14:29 · 858 阅读 · 0 评论 -
解题报告-HDU 3662 (三维凸包)
暂时还没看懂,先把模板记下来:#include #include #include #include #include #include #include #include using namespace std;#define eps 1e-7#define MAXV 310struct pt { double x, y, z; pt() { } pt(doub原创 2013-05-02 10:03:55 · 811 阅读 · 0 评论 -
解题报告-HDU 2892 (计算几何)
http://acm.hdu.edu.cn/showproblem.php?pid=2892感觉有点恶心的几何,搞了差不多一天才过。题目说的是给出原始的坐标,还有飞行速度和重力加速度,然后求炮弹最后毁灭的面积。首先是求炮弹落地的坐标,这个很好求,只要有点物理基础的人都能做出来,主要是怎么求圆和多边形的交面积。枚举每两个相邻的顶点,判断这两个顶点和两个点构成的交线和圆的关系,主要有下原创 2013-04-30 17:49:34 · 1071 阅读 · 0 评论 -
解题报告-HDOJ-1162(最小生成树——Prim)
题意:Eddy画了画像,由几个点组成,求解出能把所有点连接在一起所需要的最短线的和。这一题所涉及的内容是最小生成树,求解最小生成树的方法可以使用普林姆和克鲁斯卡尔两种方法,这里介绍一下普林姆算法的思想。假设有如下图1:点集a1 = {a,b,c,d,e},a2为空集,普林姆算法需要空集a2加入点集a1中的点,同时集合a1去掉该点,直至a1为空集。假设我们从点a开原创 2012-07-08 00:03:47 · 5472 阅读 · 0 评论 -
解题报告-HDOJ-1086(几何问题)
题意: 给你几条线段,让你求出这些线段的所有交点数。例如输入样例:先输入一个n,代表有n条线段,接着每一行输入一天线段,每两个数代表一个端点,0.00 0.00 1.00 1.00,代表着以0.00,0.00)和(1.00,1.00)为两个端点的一条线段。思路: 由两个端点可以求出这条线段所在的直线方程,并由这两个端点确定可行区间。对所有的直线两两联立求得任原创 2012-08-03 10:08:36 · 729 阅读 · 2 评论 -
解题报告-HDOJ-1285(拓扑排序)
拓扑排序算法思想: (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.注:拓扑排序得到的拓扑序列不唯一。例如:将下图进行一次拓扑排序,输出其中的一个拓扑序列。第一步:搜索图中入度为0的点,我们可以找到a、e,我们选择a,删去该点,同时原创 2012-08-21 11:05:24 · 1025 阅读 · 0 评论 -
解题报告-HDOJ-1232(并查集)
并查集是一种树形数据结构,一般用来处理一些不相交集合的合并和查询。一般有如下操作:初始化:将集合中的所有点初始化为自身,表示该点为一个单独的集合。void Make_Set(int x){//初始化 for(int i=1;i<=x;i++) { father[i]=i; rank[i]=0; }} 查找:查找两原创 2012-09-16 19:48:17 · 612 阅读 · 0 评论 -
解题报告-HDOJ-1874(单源最短路径——SPFA)
前面说过dijkstra不能对负权边进行操作,而现在介绍的SPFA算法是对dijkstra的一种改进,它可以对负权边进行处理,而且还可以判断是否存在负环。如果存在一个点进入队列的次数超过N次,则存在负环。下面SPFA的代码可以代替dijkstra的代码:int SPFA(int star, int end, int n){ dis[star] = 0; Q.push(原创 2012-09-16 21:42:07 · 980 阅读 · 0 评论 -
解题报告-HDOJ-1385(最短路径——Floyd)
我前面写过单源点的最短路径dijkstra和SPFA算法,但是如果要求多对点之间的最短路径,那我们就需要循环n次调用dijkstra算法,其算法复杂度为O(n^3)。而对于这种多个点之间的最短路径,我们还有另一种算法:Floyd弗洛伊德算法,它的算法复杂度也为O(n^3),但是它的代码量比dijkstra简单了不少。算法过程:1、从任意一条单边路径开始,所有两点之间的距离是边的权,或者是无原创 2012-09-16 22:05:08 · 745 阅读 · 0 评论 -
弱校的奋斗之计算几何之旅(1)——向量的引入
接触ACM大概有一年了,这一年来,学习了不少算法,但是,像我们这种弱校,教练是挂名的,算法都是师兄们一代又一代流传下来的,基本上师兄们会什么算法,就教我们什么算法了。我记得我高中的数学老师说过:“你们要超越老师,不然一代又一代传下去,会一直衰落的。”我们师兄流传下来的算法基本上都是图论,数据结构。而数论、几何这些方面存在着一个很大的缺口,每次遇到这类型的题目也只能望而生畏了。于是我决定要向这些方向原创 2012-11-20 18:56:56 · 1017 阅读 · 0 评论 -
解题报告-HDOJ-1251(字典树)
先给大家介绍一下什么是字典树。 字典树,顾名思义,是树的一种,哈希树的变种,优点是节省存储空间,优化查询效率。 数据结构: typedef struct _node { Node *child[26]; //指向下一个字母,因为英文字母只有26个 int n; //表示前缀数目 bool flag; //表示是否以改字母结尾(原创 2012-10-21 20:13:11 · 1038 阅读 · 0 评论 -
解题报告-HDOJ-1242(广度优先搜索)
题意:在一个N*M的地图中拯救出一个被困在迷宫中的天使,地图中的“.”表示道路,“a”表示被困的天使,“r”表示天使的朋友,“x”表示守卫,“#”表示围墙(“x”和“#”貌似在题目中没有描述出来,以至于笔者纠结了很长时间)。假设拯救出天使相当于天使的朋友跑到天使所在的位置,每移动一格,需要消耗一个单位的时间,如果道路上有士兵则需要先把士兵消灭,消灭士兵需要一个单位的时间。输出找到天使所需要原创 2012-07-03 22:48:22 · 937 阅读 · 0 评论 -
解题报告-HDOJ-2063(最大二分匹配-匈牙利算法)
匈牙利算法:找一条已经被匹配上的边和未被匹配上的边相互交替的路径,这条路径长度为奇数并且未被匹配上的边比被匹配上的边多1。通过把增广路上未被匹配上的边改为匹配上的边,而匹配上的边全部改为未被匹配上的边,就可以把匹配数加1。重复此操作直到再也找不到这样的路径。例如:第一步:我们从点a找到了与a有路径的点d,由于点d没有匹配到,所以直接添加a、d边。第二步:搜索点b,通过b点找到d原创 2012-07-17 21:49:27 · 1347 阅读 · 0 评论 -
解题报告-HDOJ-1874(单源最短路径——Dijkstra)
Dijkstra算法:使用Dijkstra算法有前提条件,所有的边为正。讲这个算法之前首先要先定义一个无穷大的量,用INF表示,而无穷大究竟是多大呢?我们知道在实际编程中,并不存在无穷大这个定义,每种数据类型都有其表示范围,而我们这里定义的无穷大,实际上是很大的整数,这个整数并不会影响到题目的其他数据。例如,题目中给定的数据为最大不超过100,而100000这个数相对于100已经很大了那么原创 2012-08-20 13:28:36 · 953 阅读 · 0 评论 -
解题报告-HDU 4325 (树状数组+离散化)
题目大意:给你n朵花,m个查询,对于每一朵花给出这朵花的开花期,对于每一个查询,输出该时间的开花数。题目很简单,一看就知道线段树或者是树状数组就可以做了,但是数据范围是10的9次方,数组开不了这么大,于是离散化,把10的9次方的数离散成10的5次方,题目就可以解决了。我这里选择的是用树状数组,因为代码量少好多,因为在查询的时候,查询的时间不一定是开花期的端点,所以我把查询的时间保存下来原创 2013-08-22 10:27:03 · 847 阅读 · 0 评论