算法与有趣代码--记录
文章平均质量分 73
笑着走完自己的路
这个作者很懒,什么都没留下…
展开
-
二分图 【总结】
术语:最大匹配、最小路径覆盖、最小点覆盖、最大独立集、最大团、最大(小)权值匹配。性质:(1) 最小路径覆盖 = 节点数 - 最大匹配。(2) 最小点覆盖 = 最大匹配。(3) 最大独立集 = 节点数 - 最小点覆盖 = 节点数 - 最大匹配 = 补图的最大团 = 。(4) 最大团 = 补图的最大独立集。求解最大匹配算法有三个:匈牙利、HK、KM(大材小用了)匈牙利算法原创 2015-11-11 18:03:29 · 541 阅读 · 4 评论 -
高斯消元 【模板】
根据kuangbin神牛模板写的,改了一些。#include #include #include #include #include #define MAXN 100using namespace std;int a[MAXN][MAXN];//增广矩阵int x[MAXN];//解集bool free_x[MAXN];//标记是否是不确定的变元in转载 2015-10-05 16:00:53 · 841 阅读 · 0 评论 -
中国剩余定理 【CRT】 【记录】
问题一:给你n个方程组:x%m[0] = a[0]x%m[1] = a[1]···x%m[n-1] = a[n-1]求变量x 的值,其中m[]必须两两互质。直接exgcd可以KOLL gcd(LL a, LL b){ return b == 0 ? a : gcd(b, a%b);}void exgcd(LL a, LL b, LL &d, LL原创 2015-10-18 14:34:32 · 1073 阅读 · 0 评论 -
线段树 + 树状数组 【小谈】
线段树和树状数组就学了下面一点,而且还是几个月前学的,说明这段时间数据结构没一点长进......还是先记录一下吧, 至于离散化,目前做的题目较少,先不写了。还要学区间操作、扫描线......任重而道远。 问题一:给你N个数和M次操作,操作分两种——1,U a b 第a个数增加b;2,S a b 求区间[a, b]的和。这类问题树状数组可以很简洁的实现:#i原创 2015-08-24 10:20:16 · 1160 阅读 · 0 评论 -
匈牙利算法改进 之 队列优化寻找极大增广路径集 —— Hopcroft-Karp算法 【记录】
算法求解:同匈牙利算法解决的问题,只不过优化了时间复杂度。算法分析:增广sqrt(n)次,每次需要遍历边数m,时间复杂度——O(sqrt(n) * m)。算法实现:1,BFS寻找多条不相交的增广路径,找到极大增广路径集。在这个过程中,设置数组dx[]、dy[]建立X集、Y集的层次图,可以理解为维护距离标号。(可能说法不恰当,这点同最大流Dinic算法里面BFS找一条增广路,原创 2015-10-17 10:29:37 · 1476 阅读 · 0 评论 -
扩展欧几里得 【记录】
原始的欧几里得算法只能求解gcd(a, b),有两种写法迭代写法:LL gcd(LL a, LL b){ LL t; while(b) { t = b; b = a%b; a = t; } return a;}递归写法:LL gcd(LL a, LL b){ return b ==原创 2015-10-17 18:42:37 · 501 阅读 · 0 评论 -
数据结构 —— 第一个程序 【顺序表】
//操作的开始***********************************//操作的进行//操作的结束***********************************#include #include #include #define MAX 1000#define MAXM 10#define OK 1#define OVERFLOW -1#define ER原创 2015-09-24 18:53:00 · 860 阅读 · 0 评论 -
全局最小割Stoer-Wagner算法 时间复杂度(o^3)
以前做过一道全局最小割,今天复习时看到了,先记录下来。给你一个N个点M条边的无向图,问它的最小割。全局最小割Stoer-Wagner算法实现 时间复杂度O(N^3) 优化后可以达到O(N^2log(N))用wage数组记录点的连通度,vis数组标记点是否在集合里面,In数组表示点被其它点合并。分两步一:找到S - T的最小割Mincut,其中S 和 T为最后并入集原创 2015-10-17 08:54:43 · 3077 阅读 · 0 评论 -
Manarcher 求 字符串 的最长回文子串 【记录】
引子:给定一个字符串s,让你求出最长的回文子串的长度。算法大致实现过程:一:为了消除回文字符串长度奇或偶的影响。先在每两个字符之间插入一个原字符串没有出现过的字符(这里就用#)构成新串str。设p[i] 为以str[i]字符为中心的回文字符串的最大半径。二:从前到后递推p数组。三:枚举所有p[i]值,更新最大值。 Manacher精华——求p[]数组。首先我们在求p[i]时...原创 2015-08-18 11:49:25 · 873 阅读 · 0 评论 -
逆序对 【总结】
今天刚看完逆序对,总结一下。逆序对:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i A[j],则 这个有序对称为 A 的一个逆序对,也称作逆序数。这里就拿一个例子来说吧:一:暴力,这里不用详细写了吧。二:归并排序,这里不做介绍,想看的。原创 2015-05-16 19:32:25 · 2140 阅读 · 0 评论 -
【stack 实现前缀、后缀、中缀表达式运算】
问题一:输入一个前缀表达式,每个运算符和数字之间都有一个空格,输入的数字全为正实数。代码实现:#include #include #include #include #include #include #include #define MAXN 600using namespace std;char str[MAXN];void solve(char *s){原创 2015-10-20 15:09:11 · 768 阅读 · 0 评论 -
次小生成树 【总结】
MST - 最小生成树引子:给你N个点以及M条边,问你MST是否唯一,若不唯一输出-1,否则输出MST的值。通过 枚举 + 删边 + 再求MST 完全可以做到求解上述题目,但时间复杂度过高。这里介绍一种(N*2)的算法,是结合prime算法实现的。算法核心思想:在prime求MST的过程中 用数组存储MST里面任意两点间的最大权值。最后枚举不在MST里面的边,判原创 2015-08-10 18:37:59 · 1349 阅读 · 8 评论 -
vector中 迭代器的使用 以及元素的去重、排序、插入、删除操作。 【小笔记】
vector原创 2015-09-17 14:34:46 · 3563 阅读 · 0 评论 -
网络流 dinic算法 SAP 记录
给定一个有向图(若是无向图,那么可以用两条有向边表示一条无向边),边有一个权值表示这条边上的流量,问题:有n个城市,告诉你m条路以及路上最多分分钟的车流量。然后我们求 从1 点压入无限多的车,问从n点 分分钟能跑出多少车量的问题称为 网络流(最大流)。我们称无限多进入车辆的点为:源点车辆的出口的点为:汇点 我们可以用如下结构体来记录信息:(这里用的是邻接表建图)原创 2015-06-12 12:17:26 · 650 阅读 · 0 评论 -
后缀数组模板
倍增:时间复杂度O(nlogn),数组均开n即可。int cmp(int *r, int a, int b, int l) { return (r[a] == r[b]) && (r[a+l] == r[b+l]);}int wa[MAXN], wb[MAXN], ws[MAXN], wv[MAXN];int R[MAXN];//下标0->n-1 存储的是1->n之间的数i原创 2016-04-04 16:28:56 · 324 阅读 · 0 评论 -
二维线段树和二维树状数组
二维线段树,支持单点更新、元素求和、查询最大值和最小值。代码:struct Nodey { int ly, ry, val, Max, Min, sum;//元素 最大值 最小值 元素和};int nx, ny;//横长 竖长int posx[MAXN], posy[MAXN];struct Nodex { int lx, rx; Nodey treey[MAXN<<原创 2016-04-01 12:22:57 · 981 阅读 · 3 评论 -
最短路之 路径记录 dijkstra + floyd + SPFA 【小笔记】
引子:我们在求解最短路的时候,有的时候需要输出路径,这里就介绍下路径记录及输出的一些方法。为了更好理解,提出一个问题:给出n个车站,m条单向路线以及 每条路线的信息即 起点终点和对应的花费(n与m同时为0表示结束),然后给出一系列的起点s和终点e(s和e同时为-1表示结束),让你求出最小花费并输出路径(假定给出的两点均是可达的)。(一) dijkstra算法实现:原创 2015-06-28 11:56:42 · 3767 阅读 · 0 评论 -
二维凸包模板 【Graham扫描算法】
推荐链接:讲的很好模板:#include #include #include #include #define eps 1e-8using namespace std;struct Point{ double x, y; Point(){} Point(double X, double Y){ x = X; y = Y;原创 2015-12-23 11:49:09 · 1576 阅读 · 0 评论 -
KM算法 求二分图最大权值的完美匹配 【模板 记录】
概念介绍可行顶标:一个节点函数l,使得对任意弧都有lx[x] + ly[y] >= Map[x][y]。相等子图:是原关系的生成子图G,包含所有点,但只包含满足lx[x] + ly[y] = Map[x][y]的弧。匈牙利树:当前拥有匹配关系原创 2015-08-24 17:22:26 · 1133 阅读 · 0 评论 -
数据结构 —— 链表实现多项式加减乘
实现多项式的加减乘运算:#include #include #include #include #include #define NULL 0using namespace std;typedef struct{ double coef;//系数 int expn;//指数}term;typedef struct LNode{ term d原创 2015-10-13 18:19:33 · 3473 阅读 · 0 评论 -
Lucas 定理 大组合数取余 【记录】
FormulationFor non-negative integers m and n and a prime p, the following congruence relation holds:whereandare the base p expansions of m and n respectively.Lucas 定理:将m写出p原创 2015-10-26 17:48:25 · 705 阅读 · 0 评论 -
【线段树 小模板】
花点时间写了线段树小模板,区间合并、覆盖、异或种类比较多,重在变换,模板就不写了。一、单点更新,查询区间最大值、区间最小值、区间和。#include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f#define eps 1原创 2015-11-10 20:32:59 · 543 阅读 · 0 评论 -
树的直径 【总结】
树的直径问题:有N个点以及M条路径,给出M条路的长度,让你找到一条 两点(任意的)间的路径,使得距离最长,并输出最长距离。思路:第一次BFS找最长路径的一个端点,第二次BFS求最长距离。模板:#include #include #include #include #define MAXN 40000+10#defin原创 2015-07-19 09:01:59 · 811 阅读 · 2 评论 -
无向图 点连通tarjan算法 求割点 + 求BCC以及BCC里面的点 + 求去掉每个点后图中BCC数目 【总结】
看了好久,终于把点——双联通看懂了。题目:给定一个有N个点M条边组成的无向图,求无向图中的割点以及去掉该点后分成的BCC数目,若不存在割点输出No SPF nodes。思路:tarjan算法:用low[]表示从该点或它的子孙出发 通过回边可以到达的最低深度优先数 更新low[u]有三点:均在tarjan中实现1,u本身的深度优先数dfn[u]2,u的子女中最原创 2015-07-09 11:57:51 · 1954 阅读 · 0 评论 -
有向图tarjan 求桥 + 求SCC以及里面的点和它的入度 +缩点 模板 【总结】
引子;给出n个点以及m条单向边求桥 + 求SCC以及里面的点和它的入度 + 缩点模板 。#include #include #include #include #include #include #define MAXN //点数 #define MAXM //边数 #define INF //无穷大 using namespace std;st原创 2015-07-18 17:27:34 · 1704 阅读 · 6 评论 -
小程序之计算器 【C++ STL栈实现】 + 【C 数组模拟栈实现】 【适用VC, DEV, codeblack】
自己写的小程序,记录一下: #include #include #include #include #include using namespace std;int in = 0, out = 0;void input(){ system("color 1f"); printf("********************************原创 2015-06-13 21:19:49 · 2122 阅读 · 0 评论 -
War-shall 算法 【求传递闭包】 离散数学记录
学离散数学时遇到到第一个算法,记录一下: 代码思路: warshall(A[1...n,1...n]r(0)<-A;for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) r(k)[i,j]=r(k-1)[i,j] or(r(k-1)[i,k] and r(k-原创 2015-06-04 21:15:43 · 2517 阅读 · 0 评论 -
学生信息管理设计
室友找到一个很牛的代码,记录下。抽空自己写一个。#include #include #include #define N 3 #define M 3 struct student{ int num; char name[20]; int score[3]; float average; }stu[N]; void in转载 2015-06-18 13:50:55 · 986 阅读 · 2 评论 -
整数划分问题——动态规划
原文出处:http://blog.csdn.net/metalseed/article/details/10858981 整数划分 有以下情况:1) 将n划分成若干正整数之和的划分数。2) 将n划分成k个正整数之和的划分数。3) 将n划分成最大数不超过k的划分数。4) 将n划分成若干奇正整数之和的划分数。5) 将n划分成若干不同整数之和的划分数。转载 2015-04-18 21:18:27 · 543 阅读 · 0 评论 -
栈和队列 小知识
原文出处:http://blog.csdn.net/zhy_cheng/article/details/8090346 栈: (一)头文件 #include(二)定义栈 stacks;(三)使用 1 : s.empty() 栈为空返回true,否则返回false;转载 2015-03-21 19:13:40 · 734 阅读 · 0 评论 -
欧拉图——欧拉通路和欧拉回路
定义:欧拉通路 (欧拉迹):通过图中每条边且只通过一次,并且经过每一顶点的通路。欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次,并且经过每一顶点的回路。欧拉图:存在欧拉回路的图。简单说欧拉通路就是首尾不相接,而欧拉回路要求首尾相接。 无向图是否具有欧拉通路或回路的判定:欧拉通路:图连通;图中只有2个度为奇数的节点(就是欧拉通路的2个端点)欧拉回路:图连通;图中所原创 2015-03-07 12:04:08 · 11106 阅读 · 0 评论 -
二分图性质
看过二分图以及匈牙利算法后,觉得应该整理一下二分图的一些性质。 二分图的性质给定一个无向图G=(V,E)首先我们知道:二分图中,点覆盖数即匹配数。 (1) 二分图的最大匹配数等于最小覆盖数,即求最少的点使得每条边都至少和其中的一个点相关联,很显然直接取最大匹配的一段节点即可。(2) 二分图的独立数等于顶点数减去最大匹配数,很显然的把最大匹配两端的点都从顶点集中原创 2015-02-22 23:07:35 · 467 阅读 · 0 评论 -
匈牙利算法
【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。-------等等,看得头大?那么请看下面的版本:通过数代人的努力,你终转载 2015-02-20 17:03:57 · 513 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假转载 2015-02-05 11:31:14 · 470 阅读 · 0 评论 -
LCA 转 RMQ算法 【总结】
首先,在你看这个算法之前,要确保你理解了RMQ的 ST 算法。但是不理解没关系啊,提供通道: 点我声明:这是方便我以后复习用的,所以总结不是特别详细。LCA - 最近公共祖先:在有根树中,两个节点u和v的公共祖先中距离最近的那个点。上图理解:如图,我们想要求出LCA(4,7),LCA(8,6),LCA(5,8)。用LCA转R原创 2015-08-08 18:48:28 · 4410 阅读 · 8 评论 -
表白专用 !!!
我相信,你会喜欢的!在大牛博客上找算法模板,不经意间发现了这个,O(∩_∩)O哈哈~ 好有趣。代码版式不是很好看,花了点时间调整了格式。原文出处:原文点这里#include #include #define N 50HANDLE hConsole;void gotoxy(int x, int y){ COORD coord;转载 2015-08-26 01:36:59 · 2201 阅读 · 4 评论 -
最小树形图 之 朱刘算法【模板】
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图。朱刘算法实现过程: 【在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图】1,选入边集——找到除root点之外,每一个点的所有入边中权值最小的,用数组in[]记录下这个最小权值,用pre[]记录到达该点的前驱;(若图中存在独立点,最小树形图是不存在的,所原创 2015-08-26 09:20:40 · 4392 阅读 · 2 评论 -
容斥原理 && 欧拉函数 && 抽屉原理 总结
听磊哥说:数论很重要,果断停下其它的知识,着重看数论。 感觉总结一下再往下看比较好。 (1)容斥原理 :重要应用 求出一个数n在区间[1,m]里面有多少个数与它互质。假设数据不超过int型。 实现过程分为两步:1, 求出m的质因子 并保存在数组里面;2, 求出区间[1,n]里面有多少个数与m不互质。 代码:#include #include in原创 2015-06-11 16:19:55 · 1116 阅读 · 0 评论 -
2-sat 【模板】
好烦。写一道题 TLE25次,感觉已经尽力了。。。留下来,以后做。 正好趁现在补下2-sat模板。前几天做2-sat,就一个有向图tarjan算法就敲了不下20遍,对这个算法理解的更加透彻了,而且还间接帮我理解了二分查找,收获不少。 2-sat 模板(对于DFS 暴力求最小字典序的模板,我就不写了,网上这个模板比较多) 一:判断是否存在可行解,若存在输出任意一组可行解。原创 2015-07-28 23:43:56 · 2943 阅读 · 0 评论 -
RMQ 之 ST算法的使用 【总结】 【附带求固定区间长度的一维技巧】
RMQ问题:区间最小值问题(也可以解决区间最大值问题)解决算法:ST (Sparse - Table算法,基于动态规划求区间最值的算法) ST算法分为预处理和查询两部分 首先定义数组:我们用定义 Amax[i][j] 为从 i开始的,长度为2^j的区间里面的最大值, Amin[i][j]为从i开始,长度为2^j的区间里面的最小值 一:预处理如原创 2015-08-05 16:09:58 · 1589 阅读 · 0 评论