自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 Trie树——字符串的插入和查找

如果给定n个字符串,要你在其中寻找字符串s思路:暴力算法:挨个比较,直到找出O(nm)如何让他的复杂度变回线性呢,就要用到Trie树了建立一个树,每个节点对应一个编号,表示一个字母,如果要在这个节点下再加入一个字母,则节点编号数++——用ch[i][a]表示一条边,i是父亲节点的编号,a是一个字母,如果父亲对这个字母有连边,ch[i][a] = sz(编号)++,所以ch[i][a]对应字母a

2017-05-16 00:46:59 786

原创 状态压缩DP(入门)

可以把一个难以描述的状态压缩为一个二进制数,即将状态用一个数字表示例题:给定一个n*m的方格,每次可以填一个1*2或2*1的矩形,若要将其填满,共有多少种填法(1<=n<=5, 1<=m<=1000) 分析:因为n的范围很小,所以我们可以把每一列都用一个二进制数表示,作为一个状态,则dp[i][j]表示前i列,第i列的装态为j时的最大填法数用dfs(i, j, now, next)表示深搜第i

2017-05-15 20:35:57 340

原创 2-sat问题

2-sat问题:给定一堆约束条件,每个都形如“xi为真/假或xj为真/假”,即:xi为真/假和xj为真/假中必有一个成立,现在问是否可以全部满足思路:可以把xi为真看成两个节点:2i, 2i+1(因为2i^1=2i+1,可以互相转化)假如说约束条件为“xi为真或xj为假”,那么2i表示“xi为真”为真,2i+1表示“xi为真”为假;2j表示“xj为假”为真,2j+1表示”xj为假“为假则,由2

2017-05-15 16:10:57 243

原创 有向图的强连通分量(Tanjan)

给定一个有向图,定义:强连通分量:在一堆点中,任意两点都可以互相到达求所有的强联通分量思路:记录一个点的时间戳和他能到达的最早点每深搜到一个点进队列,直到发现一个点能到达的最早点就是他自己,则把队尾一直到他的所有点输出,这就是一个强联通分量里的所有点//Tanjan求强连通分量 #include<stack>#include<cstdio>#include<cstdlib>#inc

2017-05-15 01:12:08 826

原创 无向图的割顶和桥

给定一个无向连通图,有以下定义:割顶:如果去掉一个节点,可以把这个无向连通图变成两个连通图,称其为割顶桥:同理,如果去掉一条边,可以把这个连通图变成两个,称其为桥求割顶和桥:令一个点为根,从这个点开始dfs用pre表示时间戳,每搜到一个还未搜到的点,标记搜到他的时间用low[]表示一个点可以连接的时间最早的点,而如果这个值还没有它的父亲的时间早或等于他父亲的时间,那么这个点的父亲一定是割

2017-05-15 00:25:06 277

原创 二分图(1)--染色问题

题目大意:给定一个连通图,让你对它进行染色,总共黑白两种颜色,相邻两个节点不能是同一种颜色,问是否可以染解析:二分图:对于一个无向连通图,如果可以把所有点分成不相交的两部分,使所有边的起点和终点分别在两个部分内,称为二分图(即不能有边的起点和终点在一个部分内)转化为本题即为不能有边的起点和终点是同一种颜色如图代码实现:定义数组color[],1表示白色,2表示黑色,0表示未访问用dfs,对

2017-05-14 21:38:20 861

原创 set的基本用法

set是一棵红黑树,在一些操作上十分高效,还具有许多priority_queue没有的功能下面是基本用法//set#include<set>#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;set<int> s;int main(){ int n;

2017-05-14 20:08:23 455

原创 拓扑排序

给定一些关系,如a > b,要求生成拓扑序,即对于所有形如a > b 的关系,最后生成的点的序列中a 必须在b的前面可以把每个关系看成一条有向边,很明显,如果可以生成序列,则这个图一定是无环的所以问题转化成了遍历有向图,生成序列,后搜索到的节点一定在先搜索到的节点的后面可以用dfs处理,每搜索到一个元素,如果他后面不会生成环,就把他放入队首,因为当当前dfs退出时,新的当前dfs的元素要放在上

2017-05-13 23:27:52 196

原创 Havel-Hakimi定理

Havel定理是用来判断是否成图的,对于一个点的序列,现在已知每个点的度,要求判定是否可以按要求组成一个图判定过程:把所有点按照度的大小从大到小排序对首元素的度为s1,则删除该元素,把他后面的s1个元素的度都-1,然后重新排序不断重复这个循环,如果过程中有点的度变成了-1,则不能成图,如果最后所有点的度都为0,则可以成图可以在给点的度-1的时候把s1和后面的连起来,就可以输出图了//Hav

2017-05-13 22:12:24 461

原创 最短路(4)--差分约束

差分约束的实质就是把多种约束连起来,比如x-y 把x-y看成一条由x指向y,权值为a的边,那么对于一堆约束条件,就可以转化为求最短路或最长路的问题对于不同的一堆约束条件,有:如果约束条件形如x-y 如果约束条件形如x-y >= a,则实际问题为求差的最小值,操作是求最长路(此处较难理解,需要用到数学中交并集的知识)解释: 对于一堆约束条件建立的如下的图: 两种约束条件原

2017-05-13 19:19:39 308

原创 最短路(3)--floyd和用floyd求最小环

先介绍floyd算法,这种算法可以用来求图中任意两点间的最短路思路:用d[i][j]表示点i到点j的最小距离如果要从点i到点j,有两种方法,一种是直接去,另一种是通过另一个点中转而他们可以通过一个点中转,也可以是两个,也可以是三个。。。。假设他们只能通过点1中转,则松弛操作为d[i][j] = min(d[i][j], d[i][1]+d[1][j])在循环完所有i,j后,再更新了最短路的

2017-05-13 16:50:12 249

原创 最短路(2)--bellman-ford和SPFA

bellman-ford首先,如果最短路存在,那么一定有一条不含环的最短路,因为如果是正环或零环,都可以直接去除,如果有负环,则最短路不存在,所以最短路顶多经过n-1个顶点,那么我们至多只需要进行n-1次松弛操作,每次操作中遍历所有边,如果该边的起点不是INF(已经松弛过)那么就对该边的终点松弛。这样就一定可以把最短路经过的所有点都松弛一遍,即求出了最短路(因为只要可以松弛,就一定有更短的方案

2017-05-13 11:43:16 329

原创 最短路(1)--dijkstra

dijkstra是求单元最短路的基本算法,大体思路为:循环n次每次找出离起点最近的点,(如果这个点已经讨论过,跳过下一个),讨论它能到达的所有下一个点v,如果起点到v的距离大于起点到u的距离加上边的权值,则更新起点到v的距离,称为松弛操作因为一个点讨论过就不会再讨论,所以总共循环n次//dijkstra#include<cstdio>#include<cstdlib>#include<

2017-05-13 10:34:27 261

原创 POJ2349(最小生成树)

题目大意:给定n个点,其中任意点都可以用无线电链接,但是无线电的连接范围不能超过D,D越大费用越高,现在可以给其中的S个点接上卫星,卫星范围无限,现在要求所有点都直接或间接的连接,求最小的D思路:把所有点都连接上后,需要把他们分成s个联通块,每个连通块里放一个卫星(不管是那个点),这样,两个连通块里的所有点都可以通过卫星连接,分成s个连通块需要删掉s-1条路既然要求D最小,那么就一定要删最大的s

2017-05-12 23:43:42 318

原创 线段树基本操作(2)

线段树基本操作(2)区间修改假如指定一个操作给一段区间的所有值加2,求任意区间的最小值修改区间时依然要按照线段树的结点搜索,但是如果一直搜索到底的话复杂度过大所以需要用到延迟标记当我指定一段区间进行修改时,依然按照线段树查找区间的方法逐层查找,但是区别是当刚好找到某结点的左右值刚好等于当前要改的左右值时,不用再继续查找下去,只需要在这个节点上加个延迟标记设要查找的区间为(ll, rr),已知

2017-05-12 16:27:19 191

原创 线段树基本操作(1)

线段树基本操作(1)(建树,查询和单点修改)用途线段树可以快速的对一段区间进行操作,包括求区间最值,并在对某点修改后再次求区间最值,对一个区间上的所有点进行修改等不需要对区间上的元素进行循环,而是一种类似于二分,分治的思想方法把一段长度为2^k的区间逐次对半分,可以总共分成2^(k+1)-1各节点,变成了一棵二叉树对于区间[lt, rt],它的子节点为区间[lt, mid]和区间[mid+

2017-05-12 11:19:36 242

原创 优先队列的基本用法(初步)

优先队列的基本用法(初步)优先队列实际上就是堆,可以用它来维护大根堆和小根堆//优先队列#include<queue>#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;priority_queue<int> da; //大根堆priority_queu

2017-05-12 09:50:11 291

原创 POJ2823(单调队列初步)

POJ2823(单调队列初步)滚动窗口问题,单调队列的入门题假设我要求最大值思路是创建一个队列,每读入一个数据就和队尾的元素比较如果他大于对尾的元素,队尾就被删除,队尾再往前一个,直到这个数据比队尾小因为是窗口滚动,如果窗口已经离开队首元素,则删除队首元素,对手元素的下一个为队首因为此时要用到下标,所以队列里的值应该是元素的下标对于这种有指针的题,代码细节非常重要,也是我最讨厌的在开始循环

2017-05-12 00:17:55 372

原创 vijos1012 平面最近点对(模板)

vijos1012 平面最近点对(模板)半年没摸键盘了,为了PKUSC要做恢复性训练了 裸的平面最近点对模板题,要用到分治算法,O(nlogn),但是这道题暴力也能过暴力纯暴力肯定用不了,要用到一些剪枝先把数组以x为第一次序,y为第二优先次序排序在两层循环中,如果p[i].x和p[j].x的差值已经大于当前算的最小距离了,那以后的就肯定不能取了,直接剪掉// 100 #include<cs

2017-05-11 21:52:03 246

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除