
算法
文章平均质量分 67
zcube
这个作者很懒,什么都没留下…
展开
-
二分算法总结
二分算法由于其复杂度为O(logN),在实际运算中具有极高的效率。二分算法思想还经常结合其它算法被应用在解决实际项目问题中。例如,对非线性方程求根。二分算法的思想简单,但编写正确却并不容易。编写二分算法的错误,往往不是因为疏忽错误,而是因为该算法过于灵活却暗藏杀机。轻则程序崩溃,机器停止;重则可能引起致命的损失。下面先给出错误程序,及样例分析。错误1:int bsearch(int *a, int原创 2015-05-06 11:42:58 · 1328 阅读 · 0 评论 -
小知识+碎东西
/** 今晚还是写点常用或不常用的小知识点吧,一看到算法两个字就头疼 1、 给出两直角边a, b hypot(a, b); //返回斜边长度 2、 scanf("%*d%*d"); //接收两个无用数字 3、 经纬度处理 设地球上某点经度为 l,纬度为 p 则这点原创 2015-09-05 10:13:41 · 605 阅读 · 0 评论 -
floyed 算法
/** floyed 是用动态规划解决完全最短路的算法,一次调用即可得到任意两个点间的最短路径 复杂度为O(n^3),适用于稠密图,顶点数一般在100 以内适用 结构简单,易于编写 floyed算法还可解决传递闭包,判断图是否为连通图 在解题时候一般不会只考 floyed 而是利用floyed 得到的结果,进行下一步解题 就像二分算法一样,提一原创 2015-09-05 09:47:10 · 3373 阅读 · 0 评论 -
二分图匹配的扩展问题
/** 前面提到了匈牙利算法解决二分图匹配问题,但是基于二分图还有几个经常 见的扩展问题如下: 1、最大独立集点数 2、最小顶点覆盖数 3、最小路径覆盖数 ********************************************************************** 最大独立集点数:原创 2015-09-05 09:54:30 · 662 阅读 · 0 评论 -
最小生成树 kruskal()
/** kruskal 算法和prim 功能一样,在点多边少的情况下更有优势 用专业的口吻说就是,kruskal 适用于疏密图,prim 适用于稠密图 还是那句话,模板都会用,关键在转换 高中就那点知识,可是得做好多题才能应付高考,知识点都会,关键在 理解题目并转换为学的知识点*/#include using namespace std;i原创 2015-09-05 10:07:02 · 525 阅读 · 0 评论 -
最小费spfa()+ek() 邻接表
/** 贴下最小费的邻接表模板 图算法中邻接表应用极其广泛,在速度和边处理方面都要比矩阵好很多 最小费邻接矩阵模板前面提到了 就不多说了 包括添边等常用的技巧前面也都提到了 就是求网络流是会用到逆流边 用邻接表添边,逆流边也相当经典,这个技巧刚开始并不好理解 比如:设edge[p] = ab; 则逆流边为 edge[p^1] = ba原创 2015-09-05 10:18:32 · 647 阅读 · 0 评论 -
bellman 算法
/** bellman算法可用来求单源最短路和判断是否有负权回路 复杂度O(VE) V:图中点的个数 E:图中边的个数 后面还会介绍spfa 算法和bellman 功能相同但要快很多 bellman算法是单源最短路中最简单的一个算法,虽然复杂度较高,但易于编写 通常用于快速刷水题…… 下面只说bellman 算法的用法, 以后也是噢*/原创 2015-09-05 00:24:37 · 1366 阅读 · 0 评论 -
下午整理的 素数打表 大数与整型相乘 求余模板
#include #include int p[101];void getPrim(int N){ // 打素数表的模板。 int i, j; // 素数最大小于N memset(p, -1, sizeof (p)); for(i=2; i*i<=N; i++) { if(p[i]) { for(j=i*2; j原创 2015-09-05 09:43:52 · 1028 阅读 · 0 评论 -
SPFA 算法
/** SPFA: Shortest Path Faster Algorithm 看到名字不禁为之一颤,SPFA算法是西南交通大学段凡丁于1994年发表的。 SPFA 也是竞赛中最常见的算法之一,不仅仅用来解决带负权的单源最短路 而且是求解差分约束问题的专用算法,也常用它和最大流合作解决最小费问题 可以说SPFA 是 dijkstra 和 bellman 的原创 2015-09-05 09:58:29 · 1482 阅读 · 0 评论 -
多重背包问题的二进制分解思想
/** 在这之前,我空间好像转过一个背包九讲,现在我就只对 01背包和多重背包有点印象了 先说下 01 背包,有n 种不同的物品,每个物品有两个属性 size 体积,value 价值,现在给一个容量为 w 的背包,问 最多可带走多少价值的物品。 int f[w+1]; //f[x] 表示背包容量为x 时的最大价值 for (int i原创 2015-09-07 19:53:13 · 5378 阅读 · 3 评论 -
欧拉路 / 回路 / 有向/ 无向 / 字典顺序
/** 欧拉路就是一笔画问题,同时会衍生出好多问题 比如:单词接龙,就是给一堆英文单词,问是否能让其首尾相接 排成一列 这样可将每个单词看成一条边,首尾字母看成点,求是否存在一 条欧拉路 一、无向图 欧拉回路:每个顶点入度都是偶数 欧拉路:所有点度数为偶数或者只有两个点度数为奇数 二、有向图 欧拉回路:每个点入度等于原创 2015-09-07 19:53:39 · 837 阅读 · 0 评论 -
单源最短路 dijkstra + heap 实现
/** 再写一篇睡觉,正好把刚刚的优先队列用下。。 前面再说单源最短路径的时候用到dijkstra 算法,现在介绍下 它的优化版,传说中的 O(N*log(E)) 废话不多说,还是那句话:模板都会用,关键在转换*/struct { int v, w, next;}edge[2*eMax]; // 无向边int edgeHead[nMax],原创 2015-09-05 10:10:15 · 2517 阅读 · 0 评论 -
匈牙利算法 && EK(邻接表)
/** 用邻接表添边是图论中基础中的基础,实用价值十分可观 添边为固定格式,理解的最好办法是画几个点,自己用手 模拟一下添边的过程,你会感慨万千,成就感不言而喻。。 链接表 3剑客为:edge[], edgeHead[], ne; edge[] 为每条边得结构体,你可以在里面放任何附加东西 如:边权w, 流量c, 费用cost。 但v, next原创 2015-09-05 09:53:26 · 1012 阅读 · 0 评论 -
dijkstra 算法
/** dijkstra 是很经典的单源最短路算法,当年 迪杰斯特拉 就是靠这个算法拿了 图灵奖,此算法应用非常广泛,尤其在网络路由中。。 这里先介绍 dijkstra 的基本连接矩阵算法,在竞赛图算法中经常用到,复杂度为 O(N^2),后面再贴用优先队列优化的 O(N*logE) 算法 dijkstra 算法不仅仅用于求最短路,利用本身的算法结构和精妙原创 2015-09-05 09:45:38 · 865 阅读 · 0 评论 -
浮点公约数
/** 这个,和那个没啥区别对吧,就是用了个math.h 里面的fmod() POJ 2335*/#include double fgcd(double a, double b) { if (a < 1e-4) //根据精度决定 return b; return fgcd(fmod(b, a), a);}原创 2015-09-07 19:52:36 · 555 阅读 · 0 评论 -
DP 最长公共子序列并标记输出
/** 动规是必考题目,有时甚至考好几道,非常灵活,非常巧妙 最长公共子序列是动规的经典题目,也被用于好多教材的例子 谈到动态规划,我对其也是最肤浅的认识,感觉和记忆化搜索 是不分家的,我一般都是先把整个问题局部化,然后分析局部 大致写个 转移方程 再验证是否正确并考虑特殊情况,不管怎 么样,只要经过大量重复练习,神马都是浮云 求其最长的原创 2015-09-07 19:53:16 · 631 阅读 · 0 评论 -
最小费用最大流 spfa() + ek()
/** 一个多月没碰,感觉忘完了…… 最小费就是有多条路可以满足最大流量的情况下所需要的最小费用 把费用改成相反数或改下spfa()的松弛就可最大费了 比如:从北京到上海运送一批货物,给出中间经过每条路线上对每辆车的收费,以及 每条路一次允许经过的车的数量,求一次性从北京到上海送尽可能多的货物情况下的最 小费用,当然中间经过的路线用二维数组即可表原创 2015-09-05 10:00:10 · 3347 阅读 · 0 评论 -
最小生成树 prim()
/** prim算法应该是我学会的第一个图算法 最小生成树,一个无向图使每两个点都连通的最小花费,每条边都会有 边权,这个算法在点少边多的情况下要比kruskal 更有优势,一般都不多于 1000个点。 比如:几个村庄铺设电话线,给出了一个图,图上描述了每两个村庄进行连接的花费, 现在求一种最小花费使每两个村庄有且仅有一条路径相连。 还原创 2015-09-05 10:05:07 · 652 阅读 · 0 评论 -
stack && queue && priority_queue 使用方法 (栈, 队列, 优先队列)
/** 贴下堆栈,优先队列的使用,竞赛中优先队列常会用到,前面两个 也经常用,但效率低,一般自己用数组写*/#include #include using namespace std;int main() { //stack stack s1; //定义一个int 型栈s1 s1.push(x); //x入栈 s1.pop(原创 2015-09-05 10:08:33 · 954 阅读 · 0 评论 -
匈牙利算法(二分图匹配)
/** 匈牙利算法是解决二分图匹配问题的凶器,二分图匹配问题在实际应用中也很 广泛,诸如婚恋、交朋友这些网站,会很快介绍给你最合适的对象,这都离不开 匹配算法的支撑。 在刚接触这些算法前往往会有一种莫名的恐惧,其实任何问题的本质都是很简单的 别被这些名词吓着了,仅仅是个名词而已,当你真正接触她的时候,其实也没你想 像的那么恐惧。。 匈牙利原创 2015-09-05 09:50:35 · 829 阅读 · 0 评论 -
拓扑排序 topsort()
/** 不知道topsort 排序有没有专门的算法,不过今天贴这个挺简单的,也好理解 拓扑排序就是,给出一系列的需求关系,求一个序列,这个序列完全满足这里面 的全部需求,直到结束 如:你想要认识 奥巴马 必须要认识 F 和 D, 你要认识 D 必须认识 B, 可是你要认识B 又得靠 A 和 C,当然认识 F 也得通过C 当然这些关系就是原创 2015-09-05 10:15:04 · 1222 阅读 · 0 评论 -
模拟退火算法解决最近最远问题
/** 模拟退火算法真的很巧妙,而且很多问题也能转换成这个算法 这个算法最大的妙处,就是它会无序的向着你所要求的答案去 寻找,直到找到符合你的精度,概率很高 如:在一个1024*768的平面上有N 个点,现在要你在这个面上找个 点到这N个点的距离和最小,精度保留 5 位小数,有个很简单的办法 就是枚举,当然不能这么干,而模拟退火算法是处理这类问题的原创 2015-09-05 10:24:21 · 2734 阅读 · 0 评论 -
EK算法(连接矩阵)
/** Edmonds-Karp算法是最简单的网络流算法,当然也比较慢复杂度为O(V*E^2) 编写简单而且很好理解。。后面还会贴最快的dinic 算法 复杂度为O(E*V^2) ( E为边数,V为点数) 网络流是个大学科,实在变化莫测,各种建图技巧,可以说竞赛考网络流 90%考建图,图建好了,直接套模板即可 这里只是简单的网络流模板而已原创 2015-09-05 09:48:30 · 1030 阅读 · 0 评论 -
用Tarjan算法求无向连通图割点&&割边
/** 割点割边挺好理解的,割点就是一个无向连通图,把其中一个点 挖掉剩下的图不连通,割边就是把一条边砍掉不连通 比如:有一个通信网络,要求一颗炸弹,把这个通信网络搞得不连通,问 炸哪个点或哪条边。 Tarjan 算法实现求割边和割点很类似,不过还是有点不同,复杂度为O(N+M) 下面用 存边写下*///求割点#include b原创 2015-09-05 10:11:42 · 3393 阅读 · 0 评论 -
树的最小支配集
/** 最小支配集,就是图中用最少的点覆盖其它所有点 如果用选A点覆盖,则与A点相连的点都被覆盖,大致 就是这样 百度里面搜到一道题 有一个图G,现在希望在一些点建立控制站,每个控制站能控制与它相临的点(直接相连), 现在希望有选择的在一些点建立控制站,使得以最小得控制站数,控制所有的点 图的最小支配集是NP 问题,我只会树原创 2016-05-13 15:29:51 · 919 阅读 · 0 评论