随笔分类 -  ACM/Algorithm

上一页 1 ··· 3 4 5 6 7
程序=算法+数据结构
摘要:1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define maxn 100005 9 10 struct blo11 {12 int w;13 int d;14 }block[maxn];15 16 bool cmp(const blo&a,const blo&b)17 {18 return a.w+a.d<b.w+b.d;19 }20 2 阅读全文
posted @ 2012-09-21 12:52 Missa 阅读(145) 评论(0) 推荐(0)
摘要:题意:求从一个点s 到 一点 e 经过 n 条边的最短路经是多少(可以有重边)贴一个floyd算法讲解:http://blog.csdn.net/niushuai666/article/details/6772706以前一直没仔细想过floyd算法,觉得很简单,今天做这题的时候,看网上的报告都有一句:floyd是每次使用一个中间点k去更新i,j之间的距离,那么更新成功表示i,j之间恰有一个点k时的最短路,如果做N - 1次floyd那么不就是i,j之间借助N - 1 个点时的最短路了。看了很久不明白为什么。也对floyd的最外围的那个k<n产生了疑惑。后来突然想到了,floyd每次更新的 阅读全文
posted @ 2012-09-03 23:24 Missa 阅读(1169) 评论(2) 推荐(0)
摘要:求最短路和比最短路大1的路的数量dij松弛的条件改变下,有四种情况1.比最短路短2.等于最短路3.长与最短路但短于次短路4.等于次短路具体见代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <vector> 7 using namespace std; 8 const int inf = 0x3f3f3f3f; 9 const int 阅读全文
posted @ 2012-08-31 13:25 Missa 阅读(1091) 评论(0) 推荐(0)
摘要:A*算法入门A*算法是一种启发式的搜索,不是纯粹的盲目式搜索,A*算法中有个估价算法g(n),对于每个点而言,都有一个g(n)和h(n)来确定的f(n),实际上就是以f(n)为参考权值来确定搜索的方向,在这里,我们的h(n)表示的是从s点出发到n这个点现在走过的路径长度,而g(n)表示的是从n到e的最短长度的大小,那么就确定了搜索的优先性,这里的A*算法的估价函数g(n)是完美估价,搜索的方向一定是对的。分析:建图的时候建一个正向的一个反向的,反向的图利用dij求终点到每个点的最短路,即为搜索的估价函数。注意的地方:st==en 的时候必须k++ 因为题目要求必须走过路径。详细见代码 1 #. 阅读全文
posted @ 2012-08-30 23:23 Missa 阅读(2170) 评论(1) 推荐(1)
摘要:A*可以理解成bfs+优先队列,优先队列的权重就是估价函数。。。。原文英文版本点这里翻译原文点这里会者不难,A*(念作A星)算法对初学者来说的确有些难度。这篇文章并不试图对这个话题作权威的陈述。取而代之的是,它只是描述算法的原理,使你可以在进一步的阅读中理解其他相关的资料。最后,这篇文章没有程序细节。你尽可以用任意的计算机程序语言实现它。如你所愿,我在文章的末尾包含了一个指向例子程序的链接。压缩包包括C++和BlitzBasic两个语言的版本,如果你只是想看看它的运行效果,里面还包含了可执行文件。我们正在提高自己。让我们从头开始。。。序:搜索区域假设有人想从A点移动到一墙之隔的B点,如下图,绿 阅读全文
posted @ 2012-08-30 19:37 Missa 阅读(332) 评论(0) 推荐(0)
摘要:题意:有N头牛,每头牛都会有比他强的或者弱的牛,按照牛的强弱排序,问有几头牛的位置是确定的。5 5(n,m)4 34 23 21 22 5则4>3>2>5 && 1>2>5故只有2,5是确定的。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 #define MAXN 102 8 #define MAXM 4510 9 10 阅读全文
posted @ 2012-08-30 19:03 Missa 阅读(235) 评论(0) 推荐(0)
摘要:题意:求两点之间的所有路径中的最高点最低的路径的最高点。例如1-> 2 123-> 2 81-> 3 5则输出8。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 #define MAX(x,y) ((x)>(y)?(x):(y)) 8 #define MIN(x,y) ((x)>(y)?(y):(x)) 9 #define inf 0x7f 阅读全文
posted @ 2012-08-30 14:48 Missa 阅读(476) 评论(0) 推荐(0)
摘要:题意:有个城市被一条河分成了南北两部分, 它们之间有N+1个航道, 标记为0~N, 每个航道的两端是一个码头, 然后每个码头都只属于一个航道, 航道间也不交叉. 现在给出各航道的航行时间以及同一河岸上各码头间的行走时间, 求出从起点S出发到终点T所需的最短时间.分析:一共有6种点:①点在北岸且不是左右端点, 则它可以往左, 右走, 或通过航道去南岸;②点在南岸且不是左右端点, 则它可以往左, 右走, 或通过航道去北岸;③点是北岸左端点, 则它可以往右走, 或通过航道去南岸;④点是北岸右端点, 则它可以往左走, 或通过航道去南岸;⑤点是南岸左端点, 则它可以往右走, 或通过航道去北岸;⑥点是南岸 阅读全文
posted @ 2012-08-30 13:38 Missa 阅读(457) 评论(0) 推荐(0)
摘要:题意:Bessie在一个row*col的矩形区域内滑雪,起点为左上角,已知初始速度v,从a 点到 b 点时,速度变为v(a)*2^(A-B)(A,B为对应点的高度),从 a 到 b 所需的时间为 a 的速度的倒数,她可向前后左右四个方向移动,求其到右下角的最少时间。分析:每点的速度是固定的:例如从a->b->c;则c出发的速度就是V*2^(A-B)*2^(B-C)=V*2^(A-C);时间则是速度的倒数。注意:1、inf要足够大2、因为矩阵内的值范围[-25,25],如果用1<<x的方式求2的幂,很显然这个数会整数超出范围。所以要用__int64t=1; 1 #incl 阅读全文
posted @ 2012-08-29 17:14 Missa 阅读(266) 评论(0) 推荐(0)
摘要:题意: 从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。注意三点地方: 一、每两点可达,即使没有地铁,也可以步行的; 二、相邻地铁可达,不相邻不用管(即在同一条地铁线上的两个不相邻站台不用管); 三、地铁线不一定是直的。(WA了好两次)View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 #define inf 0x7ffffff 6 #define eps 1e-8 7 #define MIN(x,y) ((x 阅读全文
posted @ 2012-08-29 00:14 Missa 阅读(251) 评论(0) 推荐(0)
摘要:题意:有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加分析:相当于求正权回路,dis[a]表示a点的资金。若dis[b]<(dis[a]-a转化b的手续费)*rate,显然可以更新dis[b]=(dis[a]-a转化b的手续费)*rate。以此类推,如果可以使金额增加,则说明可以存在一个回路不断增加金币数。一点小想法:开始有个想法,那就是觉得正权回路必须经过s,在想怎么判断产生的回路经不经 阅读全文
posted @ 2012-08-28 21:58 Missa 阅读(636) 评论(0) 推荐(0)
摘要:原文在这里:http://www.cppblog.com/apple365/archive/2008/11/27/67943.htmlBellman-Ford 算法及其优化Bellman-Ford算法及其优化Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题。Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好好思考),而Dijkstra算法只能处理边权非负的问题,因此Bellman-Ford算法的适用面要广泛一些。但是,原始的Bellman-Ford算法时间复杂度为O(VE),比Dijkstra算 阅读全文
posted @ 2012-08-28 21:31 Missa 阅读(272) 评论(0) 推荐(0)
摘要:题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0。这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 <= w。2.有md组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 >= w。问如果这n头无法排成队伍,则输出-1,如果牛[1]和牛[n]的距离可以无限远,则输出-2,否则则输出牛[1]和牛[n]之间的最大距离。分析:三个式子:1、s[i+1]-s[i]>=0 ==> s[i]-s[i+1]<=02、ML 时:s[end]-s[st]<=x 阅读全文
posted @ 2012-08-28 15:46 Missa 阅读(144) 评论(0) 推荐(0)
摘要:题意:已知一个序列a[1], a[2], ......, a[n],给出它的若干子序列以及对该子序列的约束条件,例如a[si], a[si+1], a[si+2], ......, a[si+ni],且a[si]+a[si+1]+a[si+2]+......+a[si+ni] < or > ki。转化:a[a] + a[a+1] + …… + a[b] < c 可以转化成前n项和sum[b] - sum[a - 1] < c,为了能用Bellman_Ford,即将< 转化成 <= ,sum[b] - sum[a - 1] <= c - 1。注意:1,松 阅读全文
posted @ 2012-08-28 12:17 Missa 阅读(153) 评论(0) 推荐(0)
摘要:输入的边有两种格式: 1. 边长确定,即xi - xj = b; 可以转化成 xi - xj <= b(xj>= xi +(-b)) 和 xi - xj >=b (即 xj - xi <= -b). 2. 边长不定,xi - xj >= 1; 可以转化成 xj - xi <= -1;分析:差分约束View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using nam 阅读全文
posted @ 2012-08-28 01:36 Missa 阅读(326) 评论(0) 推荐(0)
摘要:从第K元素看数据结构>>http://www.cppblog.com/820986942/archive/2011/05/23/146991.htmlView Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 #define ls rt<<1 8 #define rs rt<<1|1 9 #define lson l,m,ls 10 #define rson m+1,r,rs 11 阅读全文
posted @ 2012-08-08 20:16 Missa 阅读(368) 评论(0) 推荐(0)
摘要:>>搞懂树状数组:http://blog.csdn.net/int64ago/article/details/7429868据说可以用树状数组的解决的问题都可以用线段树解决,所以下面的题都是可以用线段树解决的。一维树状数组应用:我用到的模版表示:View Code 1 #define MAXN 32005 2 3 int sum[MAXN]; 4 5 int lowbit(int x) 6 { 7 return x&(-x); 8 } 9 10 void update(int x,int val)////如果要把a[i]增加v,可以通过调用如下函数实现11 {12 whi. 阅读全文
posted @ 2012-08-08 13:04 Missa 阅读(485) 评论(0) 推荐(0)
摘要:poj 1845http://blog.csdn.net/lyy289065406/article/details/6648539 阅读全文
posted @ 2012-08-01 19:57 Missa 阅读(149) 评论(0) 推荐(0)
摘要:神牛传送门:http://www.notonlysuccess.com/index.php/segment-tree-complete/再加一个(风格是notonlysuccess的风格,写的很骚...):http://www.cnblogs.com/wuyiqi/tag/%E7%BA%BF%E6%AE%B5%E6%A0%91%E5%92%8C%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 阅读全文
posted @ 2012-07-30 21:40 Missa 阅读(1436) 评论(0) 推荐(1)
摘要:数据结构---并查集小结 By-Missa 并查集是一种树型的数据结构,用于处理一些不相交集合(DisjointSets)的合并及查询问题。(百度百科)大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)View Code 1 #define MAXN 100005 2 int n,m,k,fa[MAXN]; 3 int rank[MAXN]; 4 void init(int n)//初始化 5 { 6 for(int i=0;i<=n;i++) 7 { 8 ... 阅读全文
posted @ 2012-07-22 23:29 Missa 阅读(2449) 评论(3) 推荐(3)

上一页 1 ··· 3 4 5 6 7