摘要: 一.Floyd算法假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。 1 /*每对顶点之间最短路径Floyd 2011.8.27*/ 2 3 #include <iostream> 阅读全文
posted @ 2012-10-23 20:50 曾先森在努力 阅读(184) 评论(0) 推荐(0) 编辑
摘要: Dijkstra算法的核心思想是贪心策略+动态规划算法流程:在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在dis[]初始化:源的距离dis[s]设为0,其他的点距离设为无穷大(实际程序里设成-1了),同时把所有的点的状态设为没有扩展过。循环n-1次:在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩展。对于每个与u相邻的点v,执行Relax(u,v),也就是说,如果dis[u]+map[u,v]<dis[v],那么把dis[v]更新成更短的距离dis[u]+w[u,v]。此时到点v的最短路径上,前一个节点即为u。结束。此时对于任意的u,dis[u]就是s到u 阅读全文
posted @ 2012-10-23 20:44 曾先森在努力 阅读(329) 评论(0) 推荐(0) 编辑
摘要: AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。AOE网的性质:(1)只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始;(2)只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。关键活动:关键路径上的活动称为关键活动。关键活动:e[i]=l[i]的活动 由于AOE网中的某些活动能够同时. 阅读全文
posted @ 2012-10-23 20:28 曾先森在努力 阅读(265) 评论(0) 推荐(1) 编辑
摘要: 对于一条有向边(u,v),定义u<v;满足所有这样条件的结点序列称为拓扑序列。拓扑排序就是求一个有向图的拓扑序列的算法。一个有向图顶点的拓扑序列不是惟一的。并不是任何有向图的顶点都可以排成拓扑序列,有环图是不能排的。例子:比如排课问题,比如士兵排队问题等。 拓扑排序在实际生活中和算法中都有很大的应用。比如要排一下几门课程的先后次序,我们可以把课程抽象成结点,把什么课是什么课的基础抽象成边,那么该图的一个拓扑序列就是这些课的一个可行的先后次序。各种语言的编译器都用到了拓扑排序。 数学基础:什么是拓扑排序(Topological Sort)?简单地说,由某个集合上的一个偏序得到该集合上的一个 阅读全文
posted @ 2012-10-23 20:19 曾先森在努力 阅读(1271) 评论(0) 推荐(0) 编辑
摘要: 一些定义:1.一个连通且无回路的无向图称为树.2.若图G的生成子图是一棵树,则该树称为G的生成树.3.在图G的所有生成树中,树权最小的那棵生成树,称作最小生成树.关于找出最小生成树的两种算法,一个称为Kruskal(克鲁斯卡尔),另一个叫Prim(普里姆)(1) Kruskal 算法 step1: 选取最小权边e1, 置边数i=1 step2: 若 i=n-1 结束,否则转到step3 step3: 设已选择边为e1,e2,...ei 在 G中选取不同于e1,e2,...,ei的边, 使{e1,e2,...,ei,ei+1}中无回路且ei+1是满足此条件的最小边. step4: i= i+1. 阅读全文
posted @ 2012-10-23 14:44 曾先森在努力 阅读(194) 评论(0) 推荐(0) 编辑
摘要: KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧。计算前缀 Next[i] 的值:我们令 next[0] = -1 。从 next[1] 开始,每求一个字符的 next 值,就看它前面是否有一个最长的"字符串"和从第一个字符开始的"字符串"相等(需要注意的是,这2个"字符串"不能是同一个"字符串")。如果一个都没有,这个字符的 next 值就是0;如果有,就看它有多长,这个字符的 next 值就是它的长 阅读全文
posted @ 2012-10-23 14:24 曾先森在努力 阅读(678) 评论(0) 推荐(0) 编辑
摘要: (作者matrix67) KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?”解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B串长度为m,那么这种方法的复杂度是O (mn)的。虽然很多时候复杂度达不到mn(验证时只看头一两个字母就发现不匹配了),但 阅读全文
posted @ 2012-10-23 14:21 曾先森在努力 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 一、引言主串(被扫描的串):S=‘s0s1...sn-1’,i 为主串下标指针,指示每回合匹配过程中主串的当前被比较字符;模式串(需要在主串中寻找的串):P=‘p0p1...pm-1’,j 为模式串下标指针,指示每回合匹配过程中模式串的当前被比较字符。字符串匹配:在主串中扫描与模式串完全相同的部分,并返回其在主串中的位置,这里的起始扫描位置默认为主串的第一个字符,即默认pos=0,其他情况类似。朴素匹配算法:在模式串与主串的匹配过程中,一共要进行n=Length(S)回合的匹配,每一回合分别从主串的起始字符s0,s1,...,sn-1开始进行。在具体某一回合的匹配过程中,每当模式串P中的某一字 阅读全文
posted @ 2012-10-23 14:15 曾先森在努力 阅读(296) 评论(0) 推荐(0) 编辑