
算法与数据结构
文章平均质量分 67
mmc2015
北大信科学院,关注深度强化学习。http://net.pku.edu.cn/~maohangyu/
展开
-
【网络流】最大流:Drainage Ditches【EK模板】
# include# include# includeusing namespace std;# define N 203 //点数# define M 203 //边数# define INF 99999999int n,m; //点数和边数int cap[N][N]; //保存每个边的容量int pathPreNode[N]; //保存增广路径上,每个节点的前一个原创 2015-11-04 11:05:51 · 513 阅读 · 0 评论 -
【带偏移量的并查集】:poj2492,A Bug's Life
带偏移量注意如何union:关系的更新分四种情况,自己推理一下就好。else //union { node[yp].p=xp; node[yp].r= node[x].r==node[y].r? 1:0; }如何find:int xp=node[x].p; n原创 2016-01-08 20:29:57 · 905 阅读 · 0 评论 -
【多重二分匹配+网络流】:poj2112,Optimal Milking
题意:K个挤奶器(编号1~K),每个每天最多挤M头奶牛。共有C头奶牛(编号K+1~K+C)。挤奶器和奶牛间有不同长度的路。编写程序,寻找一个方案,安排每头牛到某个挤奶器挤奶,并使得C头奶牛需要走的所有路程的最大路程最小。分析:因为有多个挤奶器和多头奶牛,因而要求最短路需要Floyd。然后用最大流算法求解;搜索最大距离的最小值采用二分枚举。构造网络流的方法:原创 2016-01-07 21:15:28 · 530 阅读 · 0 评论 -
【动态规划(最大子序列和)】:poj2479,Maximum sum
最大子序列和cin超时# include# includeusing namespace std;# define N 50005# define INT_MIN -1000000int a[N],dp[N],ls[N],rs[N];int main(){ int t,n,i,j,k; cin>>t; for(i=1;i<=t;i+原创 2015-12-28 20:41:35 · 650 阅读 · 0 评论 -
【动态规划+递归】:poj1664,放苹果
http://poj.org/problem?id=1664组合数学题,下面的叙述m=n,m>n时的情况由组合数学可以给出证明,不详细讨论。不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法:(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所原创 2015-12-03 22:10:18 · 804 阅读 · 0 评论 -
【并查集】:poj2524,Ubiquitous Religions
http://poj.org/problem?id=2524题目描述:世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。# include# include原创 2015-12-03 17:48:18 · 551 阅读 · 0 评论 -
【动态规划+递归】:poj1191,棋盘分割
http://poj.org/problem?id=1191明白几点:1)最终的均方差可以转变成:sqrt( sigma[ i:1-m ]( xi*xi ) / n - ( sum(all) / n )*( sum(all) / n ) ),不懂这个转换的需要补一下数学基础;所以最终决定最小值的是sigma[ i:1-m ]( xi*xi )。2)动归含义:dp原创 2015-12-03 21:38:18 · 657 阅读 · 0 评论 -
【递归】:poj1833,全排列
http://poj.org/problem?id=1833使用next_permutation# include# include# includeusing namespace std;string s;void Swap(int i, int j){ char si=s[i],sj=s[j]; s[j]=si; s[i]=sj;}void Ne原创 2015-09-21 09:24:34 · 557 阅读 · 0 评论 -
【递归】:poj2698,八皇后问题
http://bailian.openjudge.cn/practice/2698/注意题目是 列优先,需要变换成 行优先 来输出!递归思路:1)从curCol=1开始;2)对每一个curCol,row要从1到8依次扫描所有的可能;3)如果某个row=i不冲突,(若curCol恰巧是8,表明找到了一个解,要输出),则递归curCol+1。# in原创 2015-10-30 10:23:18 · 1065 阅读 · 0 评论 -
priority_queue的使用:简单类型与结构体
# include# includeusing namespace std;struct NODE{ int i,j; friend bool operator > (const NODE& N1, const NODE& N2) { return N1.i>N2.i; } friend bool operator < (const原创 2016-01-08 20:48:17 · 1910 阅读 · 0 评论 -
【网络流】最大流:点带需求的流通、边带下界的流通
1)点带需求的流通:新的框架特点:有多个供给点(d(v)0),都称作汇点。同时仍然满足传统最大流中的容量条件(0 需要解决的问题:由于有多个源点和汇点,所以不再考虑最大化问题,而是考虑有没有满足容量条件和需求条件的一个可行流通(可行性)。判断可行性的方法是,把带需求{ d(v) }的可行流通问题转换为在另一个网络中找最大 s-t 流的问题。另一个网络的构造方法如下:原创 2015-11-05 10:22:57 · 2385 阅读 · 0 评论 -
【优先队列:支持动态插入,寻找中位数】:poj3784,Running Median
维护一个最大堆和一个最小堆, 首先先将前两个元素中较大的加入最小堆,较小的加入最大堆。然后每次添加新元素的时候,先将其与最大堆和最小堆的堆顶进行对比,如果其大于最小堆堆顶则插入最小堆,如果其小于最大堆堆顶则插入最大堆,否则选择元素数量较小的一堆。 在插入与向上调整结束后, 如果两堆的元素数量差大于 1(即为 2),则从元素数量较多的一堆中取出堆顶插入另一堆,两堆相应进行向下原创 2016-01-07 15:26:06 · 1925 阅读 · 0 评论 -
【贪心+优先队列、网络流】:poj2614,Sunscreen
标准解是贪心:题解:贪心即可。先将翻晒霜按spf值排序,从小到大处理。对于当前处理的防晒霜,找到能使用它且spf上界最小的牛,将防晒霜供其使用。因为上界越大,选择越多,在之后可能也可以找到匹配的防晒霜,而由于从小到大处理,下界已经没有意义(不可能找到比当前spf更小的匹配),这是贪心的原则。 有一点没想明白,while(k && nodeCow[k]原创 2015-12-25 15:30:41 · 667 阅读 · 0 评论 -
【带偏移量的并查集】:poj1703,Find them, Catch them
感觉和butterfly(“http://blog.youkuaiyun.com/mmc2015/article/details/50153739”)完全一样,但还是WA,好蛋疼。。。# include# includeusing namespace std;# define N 100005struct NODE{ int p,r;//0表示和父节点相同,1表示不同原创 2016-01-10 14:39:06 · 689 阅读 · 0 评论 -
【带偏移量的并查集】:poj***,Butterfly
输入输入包含多组数据,以文件结束符为终止。每组数据第一行为两个整数,分别是n和m:n为蝴蝶的数量,编号从0到n-1m为关系的数量接下来是m组关系数据,每组数据占一行,为三个整数,前两个整数表示蝴蝶的编号,第三个整数为关系的种类(相同或者不同):0为相同,1为不同1 1 输出合理就输出YES不合理就输出NO样例输入3 30 1 01原创 2015-12-02 22:07:55 · 2154 阅读 · 0 评论 -
【并查集】:poj1611,The Suspects
http://poj.org/problem?id=1611题目大意:有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数。注意,并查集Find操作:不进行路径压缩:return Find(a[i].parent)原创 2015-12-02 21:35:01 · 580 阅读 · 0 评论 -
【优先队列】:poj2442,Sequence
题目大意是:m行n列的一个数矩阵,每行抽一个数,可以同列,那么有n^m种sequence组合,在这些sequence中,找出:m个元素相加的和 最小的n个sequence组合(输出这n个最小值)。这个题非常有意思,解题思路如下:1)对于只有一行,直接输出从小到大的排序。2)对于大于等于2行,我们采用一行一行计算n个最小值的思路,这样说起来有些抽象;具体的,如果我们只考虑从第原创 2016-01-09 22:53:15 · 751 阅读 · 0 评论 -
【并查集】:poj1182,食物链
关键是向量化的关系调整。下面能过。注意几点:FindParent、用scanf别用cin。# include# include# includeusing namespace std;# define N 50010# define K 100005struct NODE{ int parent; int relation; //原创 2015-12-24 23:17:52 · 512 阅读 · 0 评论 -
【网络流】:一些基本知识
1)求最小割的割集:在最大流中,源点 s 和残留网络中所有 s 可达的节点构成最小割。2)最大流和最小割唯一性的关系3)怎么判断一个流图中的最小割是否唯一先求最大流,得到残留网络,从源点出发得到能够到达的结点,然后从汇点出发逆着边的方向往回走得到能够到达的结点(即能够到达汇点的结点),如果结点全部能够被访问到,最小割就是唯一的。否原创 2016-01-09 13:31:42 · 2392 阅读 · 0 评论 -
【网络流】:poj1698,Alice's Chance
题目大意:爱丽丝要拍电影,有n部电影,规定爱丽丝每部电影在每个礼拜只有固定的几天可以拍电影,只可以拍前面w个礼拜,并且这部电影要拍d天,问爱丽丝能不能拍完所有的电影第一行代表有多少组数据对于每组数据第一行代表有n部电影接下来2到n+1行,每行代表一个电影,每行9个数,前面7个数,1代表拍,0代表不拍,第8个数代表要拍几天,第9个数代表有几个礼拜时间拍源点:0号点为源点;原创 2015-12-29 22:55:15 · 657 阅读 · 0 评论 -
【动态规划DP,floyd最短路】poj2240,Arbitrage
http://poj.org/problem?id=2240钱币来回兑换。大家都知道先构图,然后看图中的某个节点会不会经过一圈之后到达自己,并且路径上的权值乘积大于1。显然是最短路的反面,最长路;同时不能使用单源最短路dijkstra算法。所以使用floyd多源最短路,不过这里注意比较条件,要“最长路”。从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接原创 2015-03-25 17:05:36 · 974 阅读 · 0 评论 -
【贪心算法,高速缓存缺页】:poj***,***
给出高速缓存能够存储的页的个数K,给出要访问的页的编号{a,b,c,b,c,a,b...},给出每一次缺页时的替换策略使替换次数最少。20实际60年代,Les Belady证明了“最远将来算法”的有效性,能够将替换次数降到最小。当:一个未命中的页需要进入cache时,回收在最远的将来才会使用到的那个页例如:k=2,{a,b,c,b,c,a,b...},初始c原创 2014-11-19 13:04:16 · 1545 阅读 · 0 评论 -
【贪心算法,最小延迟调度】:poj***,***
暂时没在poj上找到对应的题目,不过思想非常简单。一堆任务,每个任务有最晚完成时间di,和需要持续的时间ti。真实安排这些任务时,每个任务有真是的开始时间si和结束时间fi。称一个任务的延迟时间为fi-di。目的:找一个安排任务的方案,使所有任务的总的延迟最小。贪心算法:最早截止时间优先。# include# includeusing原创 2015-05-03 21:16:08 · 6434 阅读 · 0 评论 -
(子)图同构算法VF2实现(2)——源代码与具体实现
上一篇关于VF2的博客写的太水了,http://blog.youkuaiyun.com/mmc2015/article/details/49777447。而且错误百出。这里给出真正需要注意的地方1)数据结构://每个邻接边的结构,注意,该结构不单独使用,必须和某个点一起使用struct EDGE{ int id2; //边的另一端的点的id int id2Label; //注意,两原创 2015-11-14 09:47:06 · 7866 阅读 · 29 评论 -
【贪心算法,区间覆盖】:poj1089,Intervals
http://poj.org/problem?id=1089# include# includeusing namespace std;# define N 50003# define M 1000003struct INTERVAL{ int s,e;};int cmp(INTERVAL a, INTERVAL b){ return a.s<b.s;}原创 2015-09-26 12:53:56 · 640 阅读 · 0 评论 -
(子)图同构算法VF2实现(1)
子图同构问题本质上就是一种匹配,VF2算法加了很多feasibility rules,保证了算法的高效性。这里只是实现最基本的判断子图同构的算法:参考文献有(其实google一把就能出来这些):http://stackoverflow.com/questions/8176298/vf2-algorithm-steps-with-examplehttp://www.zhihu原创 2015-11-11 09:00:54 · 12811 阅读 · 0 评论 -
【网络流】:调查设计、航线调度、项目选择
1)调查设计问题描述:一堆产品和一堆顾客,每个产品只能由 [ c, c' ] 个顾客做feedback,每个顾客只能做 [ p, p' ]个产品的feedback;问,能不能设计一个调查方案,使上面的条件能够满足?(这里的主要限制是,边上最小流 c、p 的要求)方法:(s, i)边上的流表示顾客 i 可以调查的产品数,因此具有[c, c']的限制;(j,原创 2015-11-06 14:57:34 · 1779 阅读 · 0 评论 -
【网络流】最大流:PIGS【EK模板、建图题】
# include# include# includeusing namespace std;# define N 1003 //点数==========题目陈述的100是有问题的# define M 1003 //边数# define INF 99999999int n,m; //点数和边数int cap[N][N]; //保存每个边的容量int pathPreNode原创 2015-11-04 11:43:42 · 780 阅读 · 0 评论 -
【网络流】最大流:求最小割值、求(边)不交路径数量、求二分匹配最大匹配数
1)最大流等于最小割:P249,定理7.13,每个流网络中,一个s-t 流的最大值等于一个s-t 割的最小容量。即,求s-t 的最小割,可以转换为求 s-t 的最大流。2)有向图和无向图中的 (边)不相交路径:说一组路径边不相交,指所有路径不共享任何一条边,但是可以共享节点。有向边不交路径问题是,在有向图G中找到边不交的 s-t 路径的最大数目;无向边不交路径问题是,在原创 2015-11-05 09:33:06 · 4899 阅读 · 0 评论 -
【动态规划】:poj2567,Tug of War
n个人拔河,是体重尽量接近(前提是人数尽量接近)。# include# includeusing namespace std;# define N 105# define W N*450/2+1//任意n个人能否满足w的体重,0表示不能,1表示能int dp[N][W];int main(){ int n,sw=0,w[N],i,j,k; cin原创 2015-12-10 19:27:49 · 1074 阅读 · 1 评论 -
【网络流】:poj2987,Firing
数学解释不多说了,参考:http://blog.youkuaiyun.com/scorpiocj/article/details/6085637最大权闭合图,最大权=sum-最小割,sum为所有正点权的和;要裁掉几个人,根据最小割的性质,被裁掉的人肯定不在最小割中,所以只要从源点开始对残留网络进行遍历即可。注意一点,sum类型为long long,否则出错。/* * Dini原创 2015-12-10 19:57:37 · 689 阅读 · 0 评论 -
【动态规划DP,二维动归】poj1651,Multiplication Puzzle
http://poj.org/problem?id=1651有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个分数,分值的计算方法是:要拿的卡片,和它左右两边的卡片,这三张卡片上数字的乘积。按不同的顺序取走N-2张卡片,得到的总分可能不相同,求出给定一组卡片按上述规则拿取的最小得分。思路,对于原创 2015-08-06 19:46:19 · 2237 阅读 · 0 评论 -
【动态规划DP,二维动归】poj1080,Human Gene Functions
http://poj.org/problem?id=1080注意,三种情况:1)ai和bi匹配(不管a[i]和b[j]是否一样,因为不匹配也可以,只是代价为负而已!!!看代码注释掉的部分就知道什么意思了),2)ai和空格匹配,再匹配ai-1和bj,3)bj和空格匹配,再匹配ai和bj-1。# includeusing namespace std;# d原创 2015-01-07 13:41:07 · 878 阅读 · 0 评论 -
【动态规划DP,一维动归】poj1857,To Europe! To Europe!
http://poj.org/problem?id=1857要运送车辆到对岸.车辆已经排好队,注意因为桥窄不能超车,分组的时候不能随意分组,前一组的车辆都排在后一组车辆的前面,即车辆的顺序是按输入固定的。只有一座单行的桥,每辆车有其重量及最最快车速,通过分组方式将车辆分成几组运输,每次只能运一组运到对岸后第二组才能出发,每组中车辆的总重量不能超过桥的载重量,运输速度则取决于原创 2015-08-18 22:10:49 · 2258 阅读 · 0 评论 -
【动态规划,带权重的区间调度】:poj3616,Milking Time
http://poj.org/problem?id=3616# include# includeusing namespace std;# define M 1003struct INTERVAL{ int s,e,w;};INTERVAL interval[M];int unOverlap[M];int cmp(INTERVAL a, INTERVAL b)原创 2015-01-21 21:07:29 · 2691 阅读 · 0 评论 -
【贪心算法,双机调度问题】:poj2751,Saving Endeavour
http://poj.org/problem?id=2751题意:2台机器,n件任务,每件任务必须先在S1上做,再在S2上做。任务之间先做后做任意。求最早的完工时间。经典问题:2台机器的情况下有多项式算法(Johnson算法),3台或以上的机器是NP-hard的。Johnson算法思想就是贪心,时间复杂度是O(nlogn) 。Johnson算法:原创 2015-04-03 08:34:27 · 1509 阅读 · 0 评论 -
【稳定匹配】:poj3487,The Stable Marriage Problem
http://poj.org/problem?id=3487Gale-Shapley算法求稳定婚姻# include# include# includeusing namespace std;# define N 30int n;char m[N],w[N];vector > mL,wL,MproposeW;map MmatchW;map WmatchM;原创 2015-09-26 12:51:41 · 1245 阅读 · 0 评论 -
【图】BFS遍历、DFS遍历、Topology排序、判断二分性
苦逼练代码!# include# include# includeusing namespace std;# define N 103# define M 1003int g[N][N];int bpG[N][N];int visit[N];void initG(){ memset(g,0,sizeof(g)); g[1][2]=1;原创 2015-11-04 09:48:28 · 630 阅读 · 0 评论 -
【网络流】:poj1087,A Plug for UNIX
注意提交时使用G++,C++会compile error题意:房间里有n个插座,每个插座都不一样。有m个不同的用电器,每个用电器有一个插头,每个插头只能插相对应的插座。再给k类转换器,每类转换器能把A插座转化成B插座,每类转换器无限个。求不能充电的用电器最少的个数。注意转换器的插座和插头有可能原来没有,需要动态添加!/* * Dinic algo for原创 2015-12-10 18:25:31 · 496 阅读 · 0 评论 -
非常好的动态规划总结,DP总结
总结的非常好,谢谢作者。http://cppblog.com/menjitianya/archive/2015/10/23/212084.html目录 一、动态规划初探 1、递推 2、记忆化搜索 3、状态和状态转移 4、最优化原理和最优子结构 5、决策和无后效性二、动态规划的经典转载 2017-06-22 09:31:18 · 76848 阅读 · 19 评论