随笔分类 -  知识储备

1 2 3 下一页
网络流之增广路算法
摘要:这部分内容在《算法竞赛入门经典》——刘汝佳 里面讲的已经很详细了。但里面对于反向流量的作用是没有说明的。这里只说一下反向流量的作用。推荐上http://www.cnblogs.com/g0feng/archive/2012/05/29/2524749.htm看下。反向流量能够让后面的流自我调整。例如当前状态下当前状态下如何寻找?用a表示残量, cap表示容量,很明显,3-4这条路不是最优的.此时BFS, 会得到 a[2] = 2, a[4] = 2, a[3] = 1 (提示:cap[4][3]-flow[4][3]=1),a[5]=1, a[6]=1, a[7]=1更新流量得到可以看到,通过 阅读全文
posted @ 2013-08-03 10:04 Still_Raining 阅读(6551) 评论(0) 推荐(0)
【转】每个程序员都应读的书
摘要:原文链接:http://news.cnblogs.com/n/125826/ 编者按:2008年 8 月 4 日,StackOverflow 网友Bert F发帖提问:哪本最具影响力的书,是每个程序员都应该读? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。” 很多程序员响应,他们在推荐时也写下自己的评语。以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10 的书。其实除了前 10 本之外,推荐数前 30 左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的... 阅读全文
posted @ 2013-07-04 20:33 Still_Raining 阅读(265) 评论(0) 推荐(0)
博弈之简单总结
摘要:最近看了一下《算法竞赛入门经典——训练指南》中的博弈部分,便急切的做了几道HDU上的博弈水题。大喊一声:我以后会继续更新的(希望如此)。两条规则:规则1:一个状态是必败状态当且仅当它的所有后继都是必胜状态。规则2:一个状态时必胜状态当且仅当它至少有一个后继是必败状态。HDU2188 悼念512汶川大地震遇难同胞——选拔志愿者(水)分析:这种类型的题目叫做巴什博奕(BashGame),可以直接做.AC代码如下:#includeint main(){ int T,n,m; while(scanf("%d",&T)!=EOF) while(T--) { scan... 阅读全文
posted @ 2013-05-28 21:40 Still_Raining 阅读(276) 评论(0) 推荐(0)
POJ2926 Requirements(最远曼哈顿距离)
摘要:题目链接。分析:借机学习了一下曼哈顿距离问题。(这图很好)我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,座标(x1,y1)的点P1与座标(x2,y2)的点P2的曼哈顿距离为:以二维平面为例:设距离最远的两点为 i, j,可知所求的最大距离必定有以下四种形式之一:(xi-xj)+(yi-yj), (xj-xi)+(yi-yj), (xi-xj)+(yj-yi), (xj-xi)+(yj-yi) 变形一下,把相同点的坐标放到一起,即 (xi+yi)-(xj+yj), (-xi+yi)-(-x 阅读全文
posted @ 2013-05-25 22:23 Still_Raining 阅读(1784) 评论(0) 推荐(0)
欧拉回路心得
摘要:对于欧拉回路为什么一定要用栈,偶进行了一下小小的探究(感谢崔学长的数据)。样例如图所示:不用栈,直接输出会怎样呢?void euler(int u){ for(int v=1; v<=n; v++){ if(G[u][v]){ G[u][v]--; G[v][u]--; printf("%d %d\n", u, v); euler(v); } }}输出结果如下:一开始输出路径会是1->2->3->4->1,搜完这些,会从3开始继续搜索并输出,3->5->6->7->3... 阅读全文
posted @ 2013-05-24 07:35 Still_Raining 阅读(463) 评论(0) 推荐(0)
HDU2767 Proving Equivalences(scc)
摘要:题目链接。题意:至少增加几条边,才能让图强连通。分析:“首先,找出强连通分量,然后把每个强连通分量缩成一个点(缩点),得到一个DAG。 接下来,设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案。 注意特殊情况: 当原图已经强连通时, 答案是0而不是1."这是《算法竞赛入门经典——训练指南》上的原话。对于证明,搜了一下,没有找到。自己呢,试着画了一下,记下个人心得。自己的理解如下;一个含n个点的图,至少要有n条边,才能强连通。即每一个点至少都会有一个入度和出度。对于得到的DAG,设有a个结点的入度为0, b个结点的出度为0,因为增加一条边会同时增加一个入度 阅读全文
posted @ 2013-05-21 19:28 Still_Raining 阅读(808) 评论(0) 推荐(0)
无向图的割顶和桥、无向图的双连通分量、有向图的强连通分量
摘要:总结自《算法竞赛入门经典——训练指南》(刘汝佳),具体分析请详见书中解析。时间戳:说白了就是记录下访问每个结点的次序。假设我们用 pre 保存,那么如果 pre[u] > pre[v], 那么就可以知道先访问的 v ,后访问的 u 。现在给定一条边, (u, v), 且 u 的祖先为 fa, 如果有 pre[v] < pre[u] && v != fa, 那么 (u, v) 为一条反向边。无向图的割顶和桥:求割顶:#include <iostream>#include <cstdlib>#include <cstdio>#incl 阅读全文
posted @ 2013-05-20 22:41 Still_Raining 阅读(1665) 评论(1) 推荐(1)
AC自动机
摘要:AC自动机,不得不说,很难理解。这里的代码是《算法竞赛入门经典——训练指南》上的代码,自己把散碎的代码整理了整理。#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#include <queue>#include <map>using namespace std;const int maxn 阅读全文
posted @ 2013-05-16 22:50 Still_Raining 阅读(364) 评论(0) 推荐(0)
树状数组
摘要:树状数组又称二叉索引树(Binary Indexed Tree,BIT),是一种解决动态连续和查询问题的数据结构。辅助数组 C: Ci= Ai-lowbit(i)+1 + Ai-lowbit(i)+2 + ... + Ai其中 lowbit(x) 代表 x的二进制表达式中最右边的1所对应的的值, 那么lowbit(x) = x & -x即C[6] 代表 A[5] 和 A[6] 的和, C[4] 代表 A[1] + A[2] + A[3] + A[4]那么如何求前缀和 Si 呢, 顺着结点i往左走, 边走边“往上爬”, 把沿途经过的 Ci 累加起来就可以了。int sum(int x){ 阅读全文
posted @ 2013-05-03 09:38 Still_Raining 阅读(273) 评论(0) 推荐(0)
uva11991 Easy Problem from Rujia Liu?
摘要:题目链接。分析:《算法竞赛入门经典——训练指南》上的一道例(水)题,map的应用,个人感觉代码中注释掉的那一句没有什么意义,就注释掉了,提交确实也对了。map的小知识点(总结自c++ primer):对于map容器,如果下标所表示的键在容器中不存在,则添加元素。书中的例子:map<string, int> word_count;sting word;while(cin>>word) ++word_count[word];在单词第一次出现时,会在word_count中创建并插入一个以该单词为索引的新元素,同时将它的值初始化为0。当只想要知道某元素存在,而当元素不存在时,并 阅读全文
posted @ 2013-04-29 17:56 Still_Raining 阅读(187) 评论(0) 推荐(0)
SDUT2408 Pick apples(贪心+完全背包)
摘要:题目链接。分析:贪心不能解决背包问题在于,它无法保证能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。因此可以大范围用贪心,小范围用背包。注意:提交过程中WA了很多次,原因已查明, WA时用的int p, v;而AC用的是long long p, v; 题目中已明确给出数据范围,按理说int是可以的,不明白为什么会WAAC代码如下:#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <cstdio>#inclu 阅读全文
posted @ 2013-04-20 16:23 Still_Raining 阅读(335) 评论(0) 推荐(0)
状态压缩动态规划(直播)
摘要:很强悍的算法,至今,仍旧迷迷糊糊。先将看懂的代码贴上来。牛人讲解:http://blog.csdn.net/lhshaoren/article/details/7526480以下代码是转自牛人的。#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;#define MAXN 21const double INF = 1<<23;struct Node{ int x 阅读全文
posted @ 2013-04-10 21:29 Still_Raining 阅读(231) 评论(0) 推荐(0)
回溯法(挑战编程)
摘要:回溯法,在以前也是会的,只不过没有系统的学习,只是从题目中接触了一些。今天,系统的学习了一下,颇有感触。对于回溯,书上的模版是这样的:bool finished = FLASE; /*found all solutions yet? */backtrack(int a[], int k, data input){ int c[MAXCANDIDATES]; // candidates for next position int ncandidates; //next position candidate count int i; //counter if(i... 阅读全文
posted @ 2013-04-05 16:54 Still_Raining 阅读(245) 评论(0) 推荐(0)
HDU2191 悼念512汶川大地震遇难同胞(多重背包)
摘要:题目链接。分析:一直在看多重背包,一开始做了几个,几乎全部TLE。原来是要用二进制优化,学习了一下(详情见本博客)。第一种做法:View Code #include <stdio.h>#include <string.h>#define MAXN 3000int n, m;int value[MAXN], weight[MAXN];int dp[150];int max(int x, int y){ return x > y ? x : y;}int main(){ int T, p, h, c, cnt, i, j; scanf("%d", 阅读全文
posted @ 2013-04-03 22:46 Still_Raining 阅读(282) 评论(0) 推荐(0)
Euclid算法
摘要:看了几天挑战编程的数论,颇有感触,尤其是欧几里得算法,特此记下笔记(毕竟书是借的)。 整除:对于整数a和b, 若存在整数k使得a = bk, 则称b整除(divides)a(用b|a来表示)。b|a也可以说成b是a的约数,或者a是b的倍数(multiple)。唯一分解定理:x能唯一的表示成它的素因数的乘积。如果两个整数的最大公约数(greatest common divisor)(也称gcd)是1,称二者是互素(relatively prime)的。Euclid算法:gcd(a,b)=gcd(b,a%b)Euclid算法的证明:1.如果b|a,则gcd(a,b)= b。因为如果b整除a,则存在 阅读全文
posted @ 2013-04-02 20:17 Still_Raining 阅读(978) 评论(0) 推荐(0)
大数运算
摘要:最近在看《挑战编程》的高精度,又学到了很多。但是,单从实用性来说,它的实现方式复杂了,而这里就要求更容易在比赛中实现的模版。大数加法,请参照本博客的一篇题解。大数减法:void subtract_big(char *a, char *b, char *c){ int i, j, flag=0; int len1 = strlen(a), len2 = strlen(b); char *pmax = a, *pmin = b; memset(c, 0, sizeof(c)*max(len1, len2)+3); if(len2 > len1 || (len1 == ... 阅读全文
posted @ 2013-03-20 22:01 Still_Raining 阅读(262) 评论(0) 推荐(0)
dij+heap
摘要:学了一下dij+heap用它做了做HDU2544遇到了两个问题:1.堆数组H开的太小会RE2.对于该题跑时15ms, 不加优化15ms,spfa跑时0ms探究:1.对于第一个问题:结点是会被重复加入的。因为每次松弛时,都会有结点加入堆,因此加入堆的结点总数会大于总的结点数。2.对于第二个问题,在网上找了找资料,迷茫中闪现一丝曙光。资料地址:http://blog.csdn.net/lyso1/article/details/5687180#include <stdio.h>#include <string.h>#include <stdlib.h>#defi 阅读全文
posted @ 2013-03-12 15:21 Still_Raining 阅读(812) 评论(0) 推荐(0)
SDUT2493 Constructing Roads(最短路,spfa)
摘要:题目链接。分析:本题就是有一条边的权值可以减半情况下的求两点间的最短路。一开始我想的是先求出不考虑减半情况下的最短路,然后将最短路中的最大权值减半。这样得到的结果是不对的。如下图:如果先找不减半最短路1->2->3。总花费为11。将最大的8除以2,所得结果为7。而从1到3将边权减半得到的是6.所以符合题意的最短路应该为1->3。所以先不考虑减半求最短路的想法是走不通的。如此的话,本题可以用两次spfa分别求两个点到所有点的最短路,然后分别枚举每一条边权值减半的情况。AC(未优化)代码如下:View Code #include <cstdio>#include &l 阅读全文
posted @ 2013-03-04 11:09 Still_Raining 阅读(338) 评论(0) 推荐(0)
堆——数据结构
摘要:堆(最大堆)的操作,以下函数用A[0]来存放元素的个数:void swap(int A[], int i, int j); //交换两个元素1.void sift_up(int A[], int i); //把堆中第i个元素上移2.void sift_down(int A[], int i); //把堆中的第i个元素下移3.void heap_insert(int A[], int x); //把元素x插入堆中4.void heap_delete(int A[], int i); //删去堆中第i个元素5.int delete_max(int A[]); //删除堆中... 阅读全文
posted @ 2013-03-01 21:28 Still_Raining 阅读(270) 评论(0) 推荐(0)
HDU3018Ant Trip(欧拉回路)
摘要:题目地址。解题报告:欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路是否存在的方法有向图:图连通,所有的顶点出度=入度。无向图:图连通,所有顶点都是偶数度。本题呢。先用并查集查看共有几棵树, 记录下每棵树中度为奇数的点的个数。 如果该树中度为奇数的点的个数为0, 且代表元的度为0,证明该点为孤立的点,按 阅读全文
posted @ 2013-02-22 21:35 Still_Raining 阅读(271) 评论(0) 推荐(0)

1 2 3 下一页