
POJ
文章平均质量分 50
111111用户昵称不存在00000
这个作者很懒,什么都没留下…
展开
-
Havel-Hakimi定理(判断一个序列是否可图)->POJ1659
Havel-Hakimi定理(判断一个序列是否可图)->POJ1659给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化 至于能不能根据这个序列构造一个图,就需要根据Havel-Hakimi定理中的方法来构图。可图化的判定: d1+d2+……dn=0(mod 2)。关于具体图的构造,我们可以简单地把奇数度原创 2016-08-02 00:14:22 · 1558 阅读 · 0 评论 -
POJ1258->最小生成树
题意: 给出一个各个节点之间权值的对应图,求这个图的最小生成树题解: Prime算法的裸题。代码:#include <stdio.h>#include <iostream>#include <string.h>#include <cmath>using namespace std ;#define INF 0x3f3f3f3f#define MAX 110int n ;b原创 2016-08-04 23:57:37 · 373 阅读 · 0 评论 -
KMP介绍->POJ3461
KMP算法介绍KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。详解算法可以参考,写的非常详细: http://www.cnblogs.com/yjiyjige/p/3263858.html题意: 求一个原创 2016-08-01 02:13:17 · 292 阅读 · 0 评论 -
POJ1961->KMP
POJ1961->KMP题目大意: 给你一个字符串,求他之前大于1的循环节. 比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4题解: next数组的运用 KMP的前缀函数处理出来的前缀数组表示当当前字符失配后,要向前调到哪一个位置可以继续原创 2016-08-15 19:37:41 · 431 阅读 · 0 评论 -
拓扑排序->POJ2585
POJ2585 题意: 有一个4*4的显示器,上面可以出现9种2*2的图片,这些图片可以相互覆盖,问输入的图片可否由那九种图片堆叠出来题解 初始化基本信息,拓扑排序判断有无环出现代码:#include <stdio.h>#include <iostream>#include <string.h>#include <string>#include <queue>using na原创 2016-08-03 22:28:09 · 712 阅读 · 0 评论 -
POJ1751->最小生成树
POJ1751->最小生成树题意: 有n个城市,已知城市的坐标和已经被连通的城市编号,求能把所有城市都连接起来的最短路径的连通方法。题解: 很明显,这个题是要求一个图的最小生成树,不过要记录并输出路径。 在每次吧一个节点加入到V1集合的时候,记录下来这个节点的横纵坐标即可。代码:#include <stdio.h>#include <iostream>#include <str原创 2016-08-05 23:53:25 · 441 阅读 · 0 评论 -
POJ1106->叉积判断点在直线的左右
POJ1106->叉积判断点在直线的左右题意: 给定平面上一些点的坐标,有一个半径固定,圆心固定且可以旋转的半圆形平面,求这个平面能覆盖到的最大点的数量。题解: 由于圆心半径一定,所以有效的点的坐标即是在这个圆形区域内的点的坐标,可以开个数组记录一下,之后可以通过枚举圆心和这些有效点构成的直线,并通过叉乘来统计每次在这条直线左侧的点的数量来更新答案。代码:#include <stdio.原创 2016-08-27 23:33:13 · 1847 阅读 · 0 评论 -
POJ2318->叉积判断点在线段的左右
POJ2318->计算几何题意: 已知n条线段把一个区域分成了n+1部分,给出一些点的坐标,求每个小区域中有多少个点。题解: 利用叉积,线段两个端点为p1p2,记玩具坐标为p0,那么如果(p0p1 X p0p2) 叉积是小于0,那么就是在线段的左边,否则右边。 枚举即可,也能用二分优化。代码:#include <stdio.h>#include <iostream>#inclu原创 2016-08-25 18:21:38 · 853 阅读 · 0 评论 -
跨立实验判断线段是否相交->POJ3304
在二维坐标下介绍一些定义:点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y*y );向量的点积:向量叉积 结果为 x1*x2 + y1*y2。 点积的结果是一个数值。 点积的集合意义: 我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a原创 2016-08-25 00:05:22 · 741 阅读 · 0 评论 -
旋转卡壳->POJ2079
旋转卡壳:1.旋转卡壳求凸包直径: 如上图: 我们定起始点为A,首先从A点开始你顺时针找到凸包上距离A点最大距离的E点; 由于A到F的距离小于A到E的距离,此时我们旋转线的左端点到B点,再去计算B到F的距离,之后旋转线段的右端点,发现BG的距离小于BF,此继续旋转左端点到下一个顶点。 每次旋转卡壳的操作就是由一个固定的左端点,和旋转方向固定的右端点,求出其到一个右端点的原创 2016-09-03 17:56:05 · 451 阅读 · 0 评论 -
LCA在线算法ST&&DFS->POJ1330&&POJ1470
LCA在线算法ST&&DFS:在线算法DFS+ST描述(思想是:将树看成一个无向图,u和v的公共祖先一定在u与v之间的最短路径上):(1)DFS:从树T的根开始,进行深度优先遍历(将树T看成一个无向图),并记录下每次到达的顶点。第一个的结点是root(T),每经过一条边都记录它的端点。由于每条边恰好经过2次,因此一共记录了2n-1个结点,用E[1, … , 2n-1]来表示。(2)计算R:用R[i]原创 2016-08-23 16:06:11 · 576 阅读 · 0 评论 -
POJ2187->凸包
POJ2187->凸包题意: 给出平面上n个点,求出这些点中距离最大的两个点。题解: 如果逐个枚举,时间复杂度将会相当高,不能满足题目要求。 可以构建一个凸包,再在凸包中枚举各个顶点之间的距离求最大值。代码:#include <stdio.h>#include <iostream>#include <cmath>#include <algorithm>#include <f原创 2016-08-30 23:38:52 · 368 阅读 · 0 评论 -
POJ2349->最小生成树
POJ2349->最小生成树题意: 要在n个节点之间建立通信网络,其中m个节点可以用卫星直接连接,剩下的节点都要用线路连接,求剩下这些线路中最大的长度需要多长题解: 明显还是最小生成树的题 如果用Prime算法,该算法现在V1集合中放入任意一个节点,然后每次选取和V1集合中的节点相连的最短的边的另一个节点加入到V1集合。 此时,可以把建成整棵最小生成树的所有边记录在一个数组原创 2016-08-07 23:52:51 · 1247 阅读 · 1 评论 -
POJ2096->概率DP
POJ2096->概率DP题意: 一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 PS:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 属于某种类型的概率是1/n。 题解:原创 2016-08-18 00:10:48 · 484 阅读 · 0 评论 -
POJ1611->并查集
题意:求包含0元素的集合的元素个数题解:基础并查集#include #include using namespace std ;#define MAX 30005int parent[MAX] ;int rank[MAX] ;int num[MAX] ;void make_set(int x){ parent[x] = x ; rank[x] = 0 ; num[x]原创 2016-07-25 16:59:20 · 281 阅读 · 0 评论 -
POJ3685->二分套二分
题意:给出一个矩阵的对应元素的计算公式,求第M小的元素的值是多少题解:首先二分答案,如果对应这个答案,比该答案小的元素个数大于M个, 则在左区间继续二分,否则在右区间二分 在统计元素个数的过程中,还会在用到一次二分,我们在枚举j的过程中,每当j固定以后,函数就是关于i的单调递增函数,因此可以二分求得i为多少时该函数的值小于之前二分的答案,并计算小于M的元素个数#i原创 2016-07-25 11:40:53 · 396 阅读 · 0 评论 -
POJ2378->树形DP
//树形DP//去掉哪些点可以使树上联通的节点个数小于n/2//对树进行后序遍历//状态转移方程:dp[root] = max(n-sum , mason) ;#include #include #include #include using namespace std ;#define MAX 10005vector tree[MAX] ;int n;原创 2016-07-10 20:28:45 · 565 阅读 · 0 评论 -
POJ1463->树形DP
//树形DP//树的最小点覆盖//f[x][1]以x为根的子树在x上放置的士兵的最少所需的士兵数目//f[x][0]以x为根的子树x上不放置的士兵的最少所需的士兵数目//状态转移方程://如果当前节点选取,则其子节点可选可不选dp[root][1] += min(dp[tree[root][i]][1],dp[tree[root][i]][0]) ;//如果当前节点不选,则其子节点必须原创 2016-07-10 16:56:10 · 1277 阅读 · 0 评论 -
POJ2796->单调栈
题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值题解:实际上这个题目就是要对每一个节点进行扩展,这样扩展的话,复杂度是O(n^2)。减少时间复杂度要用单调栈,单调栈处理的问题就是对每一个节点进行扩展的问题,这个题目要维护的是一个单调递减栈,即从栈顶元素到栈底元素,值是单调递减的,即栈顶元素的值始终是栈的最大值。然后每一个值有属于自己的区间,这个区间目的是为原创 2016-07-24 13:33:54 · 536 阅读 · 0 评论 -
POJ2524->并查集
题意:给出一些在一个集合的元素信息,求一共有多少个无交集的集合题解:并查集,初始集合个数为人数,在合并集合的过程中,每次在一个集合里合并了一个人,集合个数就减一#include #include using namespace std ;#define MAX 50005int parent[MAX] ;int rank[MAX] ;int num[MAX] ;int cnt原创 2016-07-25 17:30:37 · 895 阅读 · 0 评论 -
欧几里得与扩展欧几里得介绍->POJ1061
1.欧几里德欧几里得算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明:表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r原创 2016-07-28 01:08:21 · 368 阅读 · 0 评论 -
POJ2481->树状数组
题意:给N个节点的S和E,求对于每个节点,其他节点和它的关系满足Si Ej - Sj 的个数题解:由于E的关系递减,S的关系递增,因此可以先对E排序,然后利用树状数组更新并查询每个Sj在其之前的Si的个数就是问题的解#include #include #include #include using namespace std ;#define MAX 100005int T[原创 2016-07-26 23:35:13 · 365 阅读 · 0 评论 -
POJ1988->并查集
题意:有几个stack,初始里面有一个cube。支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部。2.count x:数在x所在stack中,在x之下的cube的个数题解:构建并查集,在合并和查找集合的过程中更新数量#include #include #include using namespace std ;#define MAX 30005原创 2016-07-26 17:55:21 · 340 阅读 · 0 评论