摘要: 基本知识: 定义1 设a和b是两个整数,如果d|a且d|b,则称d是a与b的公因子。 定义2 设a和b是两个不全为0的整数,称a与b的公因子中最大的为最大公约数,记为gcd(a,b)。 定义3 设a与b是另个非零整数,称a与b的最小的正公倍数为最小公倍数,记为lcm(a,b)。 最大公约数与最小公倍数具有如下一些性质: (1) (2)设m,a,b是正整数,则 (3)用素数因子分解法求a与b的最大公约数与最小公倍数: 首先将a,b进行因子分解成: 则有: 基本应用: 欧几里得算法: 定义4 设a=qb+r,其中a,b,q,r都是整数,则gc... 阅读全文
posted @ 2014-02-27 21:56 EtheGreat 阅读(569) 评论(0) 推荐(1) 编辑
摘要: 先看一下相关的定义: 定义1 设si是有向图G中的一个强连通分量,如果该强连通分量与图G的其他部分相连的所有弧都是向外伸展的,这样的强连通分量称为最高强连通分量。 定义2 在有向图G=(V,E)中,B是V的子集。如果对于任意的Vj属于V,不属于B,都存在一个Vi属于B,使得Vi是Vj的前代,则称B是一个点基。在有向图G中,顶点数最少的点基称为最小点基。设图G的每个顶点Vi都有一个非负的权值ai,使得顶点对应的权值之和最小的点基称为最小权点基。 基本算法: (1)找出图G=(V,E)的所有强连通分量。 (2)从强连通分量中找出所有最高的强连通分量。 (3)从每个最高的强连通分... 阅读全文
posted @ 2014-02-23 14:11 EtheGreat 阅读(511) 评论(0) 推荐(1) 编辑
摘要: 定义1 如果有向图G的任何两顶点都互相可达,则称图G是强连通图,如果有向图G存在两顶点u和v,使得u不能到达v或则v不能到达u,则称图G是非强连通图。 定义2 如果有向图G不是强连通图,他的子图G‘是强连通图,点v属于G’,任意包含v的强连通子图也是G‘的子图,则称G’是有向图G的极大强连通子图。 下面介绍强连通分量的三种算法:Kosaraju、Tarjan和Garbow算法。 Kosaraju算法 基本算法: Kosaraju算法主要是对原图G和反图GT分别进行一次dfs。 (1)对原图进行dfs形成森林(树)。 (2)然后任选一棵树对其反图按其第一次搜索回溯的逆序进行... 阅读全文
posted @ 2014-02-22 23:53 EtheGreat 阅读(2136) 评论(0) 推荐(1) 编辑
摘要: 下面简要介绍k短路、差分约束系统、有向无环图上的最短路和Floyd算法求最小环的求解方法。 1.k短路 k短路就是指次短路、第三最短路……等问题。其在实际生活中有颇多用处。 其基本算法为: 目前使用较多的算法是单源最短路配合A*。A*是搜索中比较高级的方式,A*算法结合了启发式搜索(这种方法通过充分利用图给出的信息来动态地做出决定而使搜索次数大大降低)和形式化方法(这种方法不利用图给出的信息,而仅通过数学的形式分析)。他通过一个估价函数f(h)来估计图中的当前点p到终点的距离,并由此决定他的搜索方向,当这条路径失败时,他会尝试其他路径。对于A*,估价函数=当前值+当前位置到终点的最... 阅读全文
posted @ 2014-02-22 17:51 EtheGreat 阅读(573) 评论(0) 推荐(1) 编辑
摘要: 单源最短路径 Dijkstra算法: 基本算法: 将图G中所有的顶点V分成两个顶点集合Va和Vb。如果源点S到u的最短路径已经确定,则点u属于集合Va,否则属于集合Vb。最开始的时候Va只包含源点S,其余的点属于Vb,算法结束时所有由源点S可达的点属于Va,其他点仍然留在Vb中。可以在求出最短路径长度的同时记录最短路径,方法是记录终点的前一个点,这样只要倒着查回去就能确定整条最短路径。 具体步骤: (1)首先初始化,将源点S到图中各点的直接距离当做初始值记录为S到各点的最短距离,如果不能直接到达,记为INF,S到S的距离为0。 (2)在所有属于Vb的点中找一个S到其路径长度最短... 阅读全文
posted @ 2014-02-20 21:42 EtheGreat 阅读(392) 评论(0) 推荐(1) 编辑
摘要: 首先看一下三者的定义: 定义1 对于图G=(V,E)来说,最小支配集指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V’,要么与V‘中的顶点相邻。在V’中出去任何元素后V‘不再是支配集,则支配集是极小支配集。称G的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中顶点的个数称为支配数。 定义2 对于图G=(V,E)来说,最小点覆盖指的是从V中取尽量少的点组成一个集合,使得E中所有的边都与取出来的点相连。也就是说,设V‘是图G的一个顶点覆盖,则对于图中的任意一条边(u... 阅读全文
posted @ 2014-02-20 18:47 EtheGreat 阅读(4697) 评论(0) 推荐(5) 编辑
摘要: 树上两点的最近公共祖先 对于有根树T的两个节点u和v,最近公共祖先LCA(T,u,v)表示一个接点x,满足x是u、v的祖先且x的深度尽可能大。对于点x来说,有一点非常特殊,那就是从u到v的路劲一定经过点x。 下面讨论用Tarjan算法求解该问题。 Tarjan算法基于深度优先搜索的框架,对于新搜索到的一个节点,首先创建由这个节点构成的集合,再对当前点的每个子树进行搜索,每搜索完一棵子树,则可以确定子树内的LCA询问都已解决。其他的LCA询问的结果必然在这个子树之外,这时把子树所形成的集合与当前节点的集合合并,并将当前节点设为这个集合的祖先。之后继续搜索下一棵子树,直到当前节点的所有子... 阅读全文
posted @ 2014-02-20 01:20 EtheGreat 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 定义1 对于无向图G和一棵树T来说,如果T是G的子图,则称T为G的树,如果T是G的生成子图,则称T是G的生成树。 定义2 对于一个边上具有权值的图来说,其边权值和最小的生成树称做图G的最小生成树。 定理1 对于一个图G,如果图中的边权值都不相同,则图的最小生成树唯一。 最小生成树 求无向图的最小生成树主要有Prim算法和Kruskal算法。 1.Prim算法 (1)基本算法 将图G中的所有点V分成两个顶点集合Va和Vb。在计算过程中Va中的点为已经选好连接入生成树的点,否则属于Vb。最开始的时候Va包含任意选取的图G中的一个点u,其余的点属于Vb,算法结束时所有与u连通的点属... 阅读全文
posted @ 2014-02-19 15:43 EtheGreat 阅读(2584) 评论(0) 推荐(0) 编辑
摘要: 图的遍历方式主要有深度优先遍历和宽度优先遍历,这两种遍历方式借鉴了搜索中的深度优先搜索和宽度优先搜索的思想。 下面简要介绍一下图的遍历方式及图的拓扑排序和可行遍性。 1.图的深度优先搜索 其基本思想是访问顶点V0 ,然后访问V0 邻接到的未被访问的顶点,再从该顶点出发递归地按照深度优先的方式遍历。当遇到一个顶点u,所有邻接于顶点u的点都被访问了时,则回到已访问顶点序列中最后一个拥有未被访问相邻顶点的点w,从w出发继续访问。如此直到所有的顶点都已经被访问过了。由此可见,图的深度优先遍历是沿着图的某一条分支遍历,直到末端,然后回溯,沿着另一分支进行同样的遍历,直到所有的分支都被遍历过为止... 阅读全文
posted @ 2014-02-17 00:47 EtheGreat 阅读(732) 评论(0) 推荐(0) 编辑
摘要: 下面简要介绍一些图的存储的基本知识:1.邻接矩阵 邻接矩阵是表示图的数据结构中的最简单的一种,这个矩阵的第i行第j列的数值即表示节点i和节点j的距离。这种存储方式简单直观、方便查询,但是复杂度较高,而且不能存储具有重边的图。2.前向星 前向星是一种通过存储边信息的方式存储图的数据结构。它的构造方式非常简单,读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序,前向星就构造完成了。为了查询方便,经常会有一个数组存储起点为vi 的第一条边的位置。 代码如下: 1 //所需数据结构如下: 2 //maxn 节点数;maxm 边数 3 4 int head[maxn];//存储起点... 阅读全文
posted @ 2014-02-16 15:04 EtheGreat 阅读(552) 评论(0) 推荐(0) 编辑