Data_Structure
文章平均质量分 79
tham_
凡是新的事情在起头总是这样,起初热心的人很多,而不久就冷淡下去,撒手不做了。因为他已经明白,不经过一番苦工是做不成的,而只有想做的人,才忍得过这番痛苦。
展开
-
哈夫曼树(最优二叉树)及哈夫曼算法
哈夫曼树在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶原创 2015-03-29 13:25:55 · 3961 阅读 · 0 评论 -
图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
这篇文章是对《算法导论》上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法。 最小生成树的具体问题可以用下面的语言阐述: 输入:一个无向带权图G=(V,E),对于每一条边(u, v)属于E,都有一个权值w。 输出:这个图的最小生成树,即一棵连接所有顶点的树,且这棵树中的边的权值的和最小。 举例如下,求下图的最小生成树:原创 2015-05-27 16:47:14 · 12970 阅读 · 2 评论 -
图基本算法 ,图的表示方法 邻接矩阵 邻接表
邻接表:要表示一个图G=(V,E),有两种标准的表示方法,即邻接表和邻接矩阵。这两种表示法既可用于有向图,也可用于无向图。通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远小于点个数)比较紧凑。但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点手否存在连接边时,通常采用邻接矩阵表示法,例如求最短路径算法中,就采用邻接矩阵表示。 图G=的邻接表表示是由一个包原创 2015-05-27 16:01:54 · 5544 阅读 · 2 评论 -
图算法 最小生成树邻接表 Kruskal算法(并查集)
之前对最小生成树Prim算法进行了一定的总结,并给出了代码实现,详见:图的最小生成树,Prim实现。一、介绍 由于忙于各类事务,在算法方面的学习有所停滞,现在将求最小生成树的另外一种算法补上,也就是Kruskal算法。有关最小生成树算法正确性的证明见上面链接。 Kruskal算法是一种实现起来较为简单,比较容易理解的算法,在图较为稀疏时能够获得很好的性能,原创 2015-05-27 16:52:44 · 4220 阅读 · 0 评论 -
最小生成树,POJ和HDU几道题目的解题报告(基于自己的模板)
首先POJ题目:链接:1251 Jungle Roads题目大意:纯求最小生成树,结果为最小权值边的和。采用邻接表#include #include #include #include using namespace std;#define maxn 30 //最大顶点个数int n; //顶点数,边数struct arcnode //边结原创 2015-05-27 17:01:41 · 852 阅读 · 0 评论 -
图算法 单源最短路径 Dijkstra算法(邻接表/邻接矩阵+优先队列STL)
一、前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离、消耗、费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离。比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的。现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小。有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是原创 2015-05-27 17:07:16 · 2639 阅读 · 0 评论 -
在流程图中求支配点的一种快速算法+[CodeChef FEB14]Graph Challenge解题报告(求半支配点)
0.说明本文译自Tarjan的论文:https://www.cs.princeton.edu/courses/archive/fall03/cs528/handouts/a%20fast%20algorithm%20for%20finding.pdf选取了其中的一部分,有删改,以原文为准。1.简介在学习全局流分析和程序优化时,如下图论问题自然地浮现出来。设G(V转载 2015-12-03 15:34:02 · 3503 阅读 · 0 评论 -
并查集(union)模板
并查集模板1(常用)int findset(int x)//查 { if(x != father[x]) father[x]=findset(father[x]);//查的过程中进行路径压缩,有效加快并查集运算 return father[x]; } int unio原创 2016-03-28 17:40:49 · 2429 阅读 · 0 评论 -
图算法 单源最短路径 Bellman_Ford算法(边权值为负情况)
一、前瞻 在之前的单源最短路径Dijkstra算法中,博主给出了最短路径的一些基本概念和问题,并且给出了对权值不能为负的图使用Dijkstra算法求解单源最短路径问题的方法。 我们提到,Dijkstra算法的一个巨大前提是:不能有权值为负的边。因为当权值可以为负时,可能在图中会存在负权回路,最短路径只要无限次地走这个负权回路,便可以无限制地减少它的最短路径权值,这就变相地说明最原创 2015-05-27 17:14:16 · 4085 阅读 · 0 评论 -
图基本算法 拓扑排序(基于邻接表的dfs实现)
拓扑排序,是对有向无回路图(顶点活动网络AOV网)进行排序,以期找到一个线性序列,这个线性序列在生活正可以表示某些事情完成的相应顺序。如果说所求的图有回路的话,则不可能找到这个序列。 在大学数据结构课上,我们知道求拓扑排序的一种方法。首先用一个入度数组保存每个顶点的入度。在进行拓扑排序时,我们需要找到入度为0的点,将其存入线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的入度原创 2015-05-27 16:20:18 · 4397 阅读 · 0 评论 -
图基本算法 图搜索基于邻接表的(广度优先、深度优先)
BFS 注:以下代码均为部分,关于图的表示方法参看我的博客—图的存储: 一、广度优先搜索 广度优先搜索(BFS)是最简单的图搜索算法之一,也是很多重要的图算法的原型。在Prim最小生成树算法和Dijkstra单源最短路径算法中,都采用了与广度优先搜索类似的思想。 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,原创 2015-05-27 16:07:49 · 8521 阅读 · 1 评论 -
邻接矩阵实现BFS广度优先搜索
#define _CRT_SECURE_NO_WARNINGS#include #include using namespace std;#define VERTEX_NUM 8bool visited[VERTEX_NUM + 1]; // 访问标志数组(备忘表)int FirstAdjVex(bool G[VERTEX_NUM + 1][VERTEX_N转载 2015-03-29 22:53:44 · 926 阅读 · 0 评论 -
C++ 栈和队列的介绍与使用
使用标准库的栈和队列时,先包含相关的头文件#include#include定义栈如下:stack stk;定义队列如下:queue q;栈提供了如下的操作s.empty() 如果栈为空返回true,否则返回falses.size() 返回栈中元素的个数s.pop() 删除栈原创 2015-03-29 22:38:29 · 19724 阅读 · 0 评论 -
深度优先搜索 DFS(邻接矩阵表示)
#define _CRT_SECURE_NO_WARNINGS#include using namespace std;//#define PATH#define VERTEX_NUM 8#ifdef PATHint count = 1;#endifbool visited[VERTEX_NUM + 1]; // 访问标志数组(备忘表)int FirstAdj转载 2015-03-29 22:50:56 · 1239 阅读 · 0 评论 -
深度优先搜索DFS(邻接表实现)
#define _CRT_SECURE_NO_WARNINGS#include using namespace std;#define PATH#define VERTEX_NUM 8#ifdef PATHint count = 1;#endifbool visited[VERTEX_NUM + 1]; // 访问标志数组(备忘表)struct Arc转载 2015-03-29 22:52:37 · 778 阅读 · 0 评论 -
邻接表实现BFS广度优先搜索
#include #include #include #define VERTEX_NUM 8typedef enum {FALSE = 0, TRUE = 1}BOOL;typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; // struct不能少}ArcNode;BOOL visi原创 2015-03-29 22:55:12 · 1085 阅读 · 0 评论 -
二叉树遍历,栈实现二叉树的非递归遍历
另见求树高 http://blog.csdn.net/Justme0/article/details/7694704/********************************************************************created: 2014/05/11 23:13filename: main.cauthor: Just原创 2015-03-29 22:49:01 · 1780 阅读 · 0 评论 -
广义表的链式定义和基础操作
广义表的定义广义表(Lists,又称列表)是线性表的推广。线性表定义为n>=0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,容许它们具有其自身结构,这样就产生了广义表的概念。 广义表是n (n>=0)个元素a1,a2,a3,…,an的有限序列,其中ai或者是原子项,或者是一原创 2015-04-08 21:21:11 · 3379 阅读 · 1 评论 -
(struct)结构体变量作为函数参数调用的方法小结
结构体变量作为函数参数传递的3种方法将一个结构体变量中的数据传递给另一个函数,有下列3种方法:用结构体变量名作参数。一般较少用这种方法。用指向结构体变量的指针作实参,将结构体变量的地址传给形参。用结构体变量的引用变量作函数参数。原创 2015-04-29 19:37:38 · 95470 阅读 · 16 评论 -
二分图的最大匹配、完美匹配和匈牙利算法
这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为原创 2016-04-18 11:58:26 · 2840 阅读 · 0 评论