算法模板
文章平均质量分 71
betwater
博客已迁移,如有问题请访问https://icecory.com
展开
-
并查集模板
//并查集算法 void init(int vn){ for(int i = 0;i <= vn;++i) Father[i] = i; } int find(int x){ return (Father[x] == x) ? x : Father[x] = find(Father[x]); } inline v原创 2017-03-23 13:59:54 · 445 阅读 · 1 评论 -
图论 最大团,最大独立集
经典的NP完全问题,只有暴力解,时间复杂度O(n2^n)对于无向图来说所谓最大团, 其实就是找一个最大完全子图,最大就是包含的点最多.而最大独立集 == 补图的最大团这里使用深度优先搜索实现,对于每一个结点,考虑要与不要两种状态,则问题构成一个子集树,本质上与01背包一样,只不过多了联通性的判断#include const int SIZE = 55;int Gra原创 2016-11-12 14:11:48 · 4561 阅读 · 0 评论 -
强联通分量 Tarjan算法 模板
/* 图使用向量数组保存,注意初始化edge * 每个点对应的 最大分量的序号 保存在sccNub中 * 可以增加一个vector 存储每个 最大分量中的点 * 所有下标都是 1 ~ n */const int SIZE_N = 10050;vector Edge[SIZE_N];int pre[SIZE_N] , lowlink[SIZE_N] , sccN原创 2016-10-29 15:00:58 · 329 阅读 · 0 评论 -
图论 最小割Toer-Wagner算法
参考来源:http://blog.sina.com.cn/s/blog_700906660100v7vb.html这里讨论无向联通图全局最小割方法一 因为两点的最小割其实就是最大流,所以我们可以用dinic算法,枚举源点与汇点, 枚举时间复杂度O(n^2) , Dinic算法 时间复杂度O(n^2m),总的时间复杂度O(N^4M),显然当n很大的时候,需要的时间特原创 2016-10-19 14:00:25 · 1345 阅读 · 0 评论 -
快速傅立叶变换 模板
HDU 1402A * B Problem PlusTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18696 Accepted Submission(s): 4246Problem Descrip转载 2016-11-08 15:28:12 · 529 阅读 · 0 评论 -
字符串 最小表示算法
参考自http://blog.csdn.net/cclsoft/article/details/5467743循环字符串的最小表示法的问题可以这样描述:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。转载 2016-09-22 17:29:06 · 925 阅读 · 0 评论 -
数论模板 满足a^x≡1(mod n)的最小正整数
Description满足a^x≡1(mod n)的最小正整数x称为a模n的阶。现给出两个正整数,求x。Input第一行输入k,表示有k组数据之后k行每行两个数a,n(2Output对于每组输入,用一行输出x的值,若不存在输出-1Sample Input22 32 4Sa原创 2016-08-15 12:42:20 · 2932 阅读 · 0 评论 -
计算几何 求n个点中最大四边形
#define SIZE 2100struct point_t{ llt x,y;}P[SIZE];//叉积,OA×OBinline llt cross(point_t const&O,point_t const&A,point_t const&B){ llt xoa = A.x - O.x; llt yoa = A.y - O.y; llt xob = B.x - O.原创 2016-08-25 20:53:48 · 687 阅读 · 0 评论 -
组合数学 组合数 卡特兰数 斯特林数
import java.math.*;import java.util.Scanner;import java.util.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger []Catalan =原创 2016-08-09 22:54:44 · 643 阅读 · 0 评论 -
计算几何 graham 最大凸包
凸包的严格凸多边形Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KBTotal submit users: 39, Accepted users: 35Problem 11326 : No special judgementProblem description原创 2016-08-10 23:42:29 · 1783 阅读 · 0 评论 -
日期类模板 , 该日期是第几天,第几天的日期,两个日期的差 ,一个日期的n天之后的日期...
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2315http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=10498以上是验证模板的题目/* * 模板有风险,使用需谨慎 , * 在获取某年的天数时,可以打原创 2016-12-10 20:27:43 · 569 阅读 · 0 评论 -
快速傅立叶 哈尔滨理工ACM程序设计全国邀请赛(网络同步赛) D. Pairs
PairsDescriptionGiven N integers,count the number of pairs of integers whose sum is less than K. And we have Mqueries. InputThe first behavioris an integer T (1 The next M lines,ea原创 2016-12-08 01:49:53 · 969 阅读 · 0 评论 -
中国剩余定理 Chinese remainder theorem(CRT)
中国剩余定理又称孙子定理, 主要是为了解线同余方程组x ≡ a1 ( mod m1 )x ≡ a2 ( modm2 )x ≡ a3 ( modm3 ) .........x ≡ an ( modmn )成立条件是m1,m2, ... ,mn 两两互质, 则对任意的整数:a1,a2, ... ,an,方程组S 有解 并且可以原创 2016-11-26 14:32:34 · 2366 阅读 · 0 评论 -
ACM 头文件
#include #include #include #include #include #include #include //stl#include #include #include #include #include #include #include #include #include #include #include #include #inc原创 2016-08-08 23:29:36 · 468 阅读 · 0 评论 -
莫队算法模板
#include #include using namespace std;int const SIZE = 30100;int const BLOCK_SIZE = 200;//分块大小为接近根号n的整数,这样容易调试struct _t{ int s,e; int idx;};bool operator < (_t const&lhs,_t const&rh转载 2017-03-11 18:37:39 · 564 阅读 · 0 评论 -
数论求逆元的三种方法
扩展欧几里德算法//非递归的扩展欧几里德算法 //返回a、b的gcd,同时x、y满足ax+by=gcd int_t exEuclid(int_t a,int_t b,int_t&x,int_t&y){ int_t x0 = 1, y0 = 0; int_t x1 = 0, y1 = 1; x = 0; y = 1; int原创 2017-03-11 18:29:04 · 1899 阅读 · 0 评论 -
高斯消元模板
//基本版#include#include#include#include#includeusing namespace std;const int SIZE = 50;int a[SIZE][SIZE];//增广矩阵int x[SIZE];//解集bool free_x[SIZE];//标记是否是不确定的变元/*void Debug(int equ,int var)原创 2017-03-03 09:48:41 · 291 阅读 · 0 评论 -
高斯消元 浮点数模板
//接口:Gauss();解存在x数组中。equ,var分别表示方程个数和变量的个数,(因为是变量 的个数不算常数的个数)要赋值。a就是行列式,其中常数是在方程右侧的符号。 int const maxn = 2000; const double eps=1e-10; double a[maxn][maxn],x[maxn]; int equ,var; int Gauss()转载 2017-03-03 11:07:21 · 634 阅读 · 0 评论 -
数论 BSGS 模板
虽然看不懂原理,但是实现还是不难,留一发模板....//POJ 2417//baby_step giant_step// a^x = b (mod n) n为素数,a,b < n// 求解上式 0 <= x < n的解#include #include #include #define MOD 76543using namespace std;int hs[MOD], hea原创 2016-12-09 19:39:01 · 435 阅读 · 0 评论 -
贝尔数 hdu4767 (矩阵快速幂+中国剩余定理+bell数+Stirling数+欧几里德)
#include #include typedef long long llt ;typedef long long int_t;using namespace std;/* * 先写好三个模板, 矩阵快速幂 , 扩展欧几里德 , 中国剩余定理 *///非递归的扩展欧几里德算法//返回a、b的gcd,同时x、y满足ax+by=gcdint_t exEuclid(int_t a原创 2016-11-25 23:30:32 · 611 阅读 · 0 评论 -
图论 最大流FF (Ford-Fulkerson)
#include using namespace std;typedef int weight_t;const int SIZE_E = //500;const int SIZE_V = //205;int Start,End;struct edge_t{ int node; weight_t c; edge_t *next; edge_t *redg原创 2016-07-29 12:42:41 · 566 阅读 · 0 评论 -
c++产生随机数
1.rand()功能:随机数发生器用法:int rand(void)所在头文件: stdlib.hrand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是655原创 2016-12-02 13:37:30 · 629 阅读 · 0 评论 -
计算几何 点到线段的距离 点在简单多边形内 点到凸多边形的距离
部分内容参考 http://blog.csdn.net/angelazy/article/details/384892931.点到线段的距离 矢量算法矢量算法过程清晰,如果具有一定的空间几何基础,则是解决此类问题时应优先考虑的方法。当需要计算的数据量很大时,这种方式优势明显。由于矢量具有方向性,故一些方向的判断直接根据其正负号就可以得知,使得其中的一些问原创 2016-09-04 18:58:28 · 6096 阅读 · 1 评论 -
编译原理 文法分析
#include #include #include #include #include using namespace std;//S :: p~z//S :: NS;//S :: CSS | DSS | ESS | ISSconst int SIZE = 1111;char s[SIZE];int idx;bool Parse(){ char ch = s[原创 2016-08-12 21:44:26 · 704 阅读 · 0 评论 -
计算集合 两个圆的面积交与并
Area of CirclesTime Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Problem description There are two circles on the plane. Now you must to calculate the area w原创 2016-09-15 19:30:57 · 1408 阅读 · 0 评论 -
筛法求质数,欧拉函数
普通筛法const int SIZE = 65000;bool isComp[SIZE] = {false};int P[SIZE] = {2};int Pcnt = 1; // 从1开始void sieve(){ for (int i = 2;i < SIZE;++i){ if ( isComp[i] )continue; P[Pcnt+原创 2016-07-31 10:37:26 · 644 阅读 · 0 评论 -
最长公共序列 最长递增子序列 最长公共递增子序列 模板
可以用hdu 1159 测试代码#define N 500/* *下标要从0开始 0~len-1 */int dp[N+1][N+1];const int maxn = 500;int LCSL(char const str1[],char const str2[],int len1,int len2){ int len=max(len1,len2); for(原创 2016-08-04 21:24:51 · 402 阅读 · 0 评论 -
后缀数组 模板
倍增算法#include #include /* * da函数中的m要小于SIZE; * m可以开很大,前提是SIZE 也要开很大 */int const SIZE = 1000;//分隔符,多串连接时需要用到,第0个为结束符,肯定用到char const DELIMETER[] = {'#'};int const DELIMETER_CNT = 1;//字母表的字母个原创 2016-07-30 19:21:51 · 300 阅读 · 0 评论 -
10 进制转16 进制输出 模板
代码参考http://blog.csdn.net/zz198808/article/details/7485214//c 的printf 提供了16进制的格式化输出printf("%x",x);#define N 100#define k 16void tran(int num){ int arr[N],i; for (i=0;i <N;i++转载 2016-07-30 00:21:19 · 318 阅读 · 0 评论 -
图论 最大流 Dinic
#include using namespace std;typedef int weight_t;const int SIZE_E = //500;const int SIZE_V = //205;int Start,End;struct edge_t{ int node; weight_t c; edge_t *next; edge_t *redg原创 2016-07-29 22:50:50 · 338 阅读 · 0 评论 -
图论 匈牙利最大匹配
本文部分转自http://blog.csdn.net/acm_cxq/article/details/52038059 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。转载 2016-07-29 11:14:06 · 1279 阅读 · 0 评论 -
拓扑排序 模板
/*注意初始化init(); *点从0开始计算; 读入数据的时候要-1;输出的时候要加1 * * */int Ecnt = 0;int n,m;int const SIZE_E = //1000010;int const SIZE_V = //10010;struct edge_t{ int v; edge_t *next;}Edge[SIZE_E];原创 2016-07-25 17:50:12 · 299 阅读 · 0 评论 -
最大流的Ford-Fulkerson方法初步
const int SIZE_V //= 600;const int SIZE_E //= 600;typedef int weight_t;int n,m;int start //= 1;int end //= m;//边的结构struct edge_t{ int node; weight_t c;//c为容量 edge_t* next; edg原创 2016-07-25 12:15:55 · 335 阅读 · 0 评论 -
最小生成树 Kruskal 算法模板
/*Kruskal 算法 *注意:点是从1到n编号 * */typedef int weight_t;const int SIZE_V = 101;const int SIZE_E = SIZE_V / 2 * SIZE_V;int Father[SIZE_V];int Ecnt = 0;//int n; // 此处写点的全局变量//并查集算法void init(int原创 2016-07-24 16:35:06 · 409 阅读 · 0 评论 -
Manacher 算法模板
参考自 http://www.cnblogs.com/ikids/articles/4660011.htmlhttp://blog.csdn.net/ggggiqnypgjg/article/details/6645824/算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串转载 2016-08-01 11:48:55 · 333 阅读 · 0 评论 -
spfa 算法模板
#include #define MEM(a,x) memset(a , x , sizeof(a))using namespace std;typedef int weight_t;const int SIZE_E = //1000000;const int SIZE_V = //1050;int n;int ECnt = 0;struct edge_t{ int原创 2016-07-27 10:39:45 · 331 阅读 · 0 评论 -
KM算法二分图完美匹配 模板
#include #include #define M 310#define inf 0x3f3f3f3fint n,nx,ny;int lx[M],ly[M]; //lx,ly为顶标,nx,ny分别为x点集y点集的个数int _visx[M],_visy[M],w[M][M],_slack[M],_link[M];int DFS(int x){ _visx[x]原创 2016-08-09 22:20:33 · 524 阅读 · 0 评论 -
求三角形的面积
利用三点坐标可以直接求面积向量法向量AB = [x2 - x1, y2 - y1]向量AC = [x3 - x1, y3 - y1]三角形ABC的面积 = 0.5|AB||AC|sin(角BAC)【|AB|为向量AB的模,也就是向量AB的长度】= 0.5*|向量AB与向量AC的叉积|= 0.5*|(x2 - x1)(y3 - y1) - (y2 - y1)(x3 - x原创 2016-08-24 18:00:14 · 720 阅读 · 0 评论 -
计算几何 多边形的交与并
/* * 多边形的交,多边形的边一定是要按逆时针方向给出 * 还要判断是凸包还是凹包,调用相应的函数 * 面积并,只要和面积减去交即可 */#include using namespace std;const int maxn = //300;const double eps = 1e-8;int dcmp(double x){ if(x > eps) return原创 2016-09-03 14:40:15 · 6744 阅读 · 1 评论 -
RMQ ST 算法模板
#include /*区间从0 ~ n标号 *注意Max的二维长度 */int A[100050];int Max[100050][20];void ST(int n){ int i,j; //初始化,长度为1的区间 for(i=0;i<n;i++) Max[i][0] = *(A+i); //类似倍增法 for(j=1;(1<<j原创 2016-08-31 19:53:45 · 375 阅读 · 0 评论