
算法与数据结构
文章平均质量分 77
Neil_Lai_
这个作者很懒,什么都没留下…
展开
-
图论算法-搜索
BFSbool visited[MAX_VERTEX_NUM); //访问标记数组 void BFSTraverse(Graph G){ //对图G进行广度优先遍历,设访问函数为visit() for(i=0;i<G.vexnum;i++) visited[i]=FALSE; //访问原创 2017-04-29 10:27:32 · 643 阅读 · 0 评论 -
哈夫曼树和哈夫曼编码
哈夫曼树要解决的问题是对不同频率元素查找的效率最高,哈夫曼编码代码如下:首先要明白,哈夫曼树要查找的元素都在叶结点上,而且哈夫曼树的最终元素是确定的为2*n-1个。这样我们可以用结点数组来表示树,每一个结点的 child和parent指向自己的父亲和儿子的索引。首先实现select函数,从结点数组选出权重最小的两个合并,存储新结点,构造出哈夫曼树,然后从叶结点开始向上查找,左儿子为0,右儿子为原创 2017-08-06 20:58:04 · 611 阅读 · 0 评论 -
图论算法-建图和最短路
建图方法:详细参见http://blog.youkuaiyun.com/stay_accept/article/details/50886067常见两种:联表法#include #include #include #include #include using namespace std; int N,M; struct node{ int t原创 2017-04-26 13:36:00 · 539 阅读 · 0 评论 -
红黑树代码
原文链接:http://www.mamicode.com/info-detail-1431070.html#define BLACK 1#define RED 0using namespace std;class bst {private: struct Node { int value; bool color; Node转载 2017-08-16 18:12:04 · 334 阅读 · 0 评论 -
图论算法-并查集
初始化把set所有值设为-1(都是根),合并两个集合的时候,先用find函数找出各个集合的根,寻找根的时候利用递归进行路径压缩,都指向根结点。合并的时候先比较规模,由于是负数,更大值更小。void Union( SetType S, SetName Root1, SetName Root2 ){ /* 这里默认Root1和Root2是不同集合的根结点 */ /* 保证小集合并入大原创 2017-04-27 11:13:39 · 402 阅读 · 0 评论 -
反字典序输出整数所有分割方式
来源是《C语言名题精选百则》算法思想是:(1)每次从数中抽取一个残留数sum。如果结尾不是1,sum为1,如果结尾是1,sum是所有1的和加1.(2)抽取sum后原来的数变成size。再用size去分sum。(3)sum%size作为最后一个数。/* ------------------------------------------------------ *//* PRO原创 2017-05-07 15:01:39 · 465 阅读 · 0 评论 -
字典序全排列
C语言名题百则的字典序排列程序好像优点问题。。。参考了另外一位大神的程序思路就是先确定排列个数,然后每次从排列从右往左找出第一个逆序数,再将其与右边最小的数交换,然后将右边数反转。#include #includeint a[10], N;int cmp(const void *a, const void *b){ return *(int*)a - *(int*)b;}原创 2017-05-06 17:30:15 · 657 阅读 · 0 评论 -
旋转法列出所有排列
代码如下:/* ------------------------------------------------------ *//* PROGRAM permutation by rotation : *//* Give an integer n, this program generates all *//* possibl原创 2017-05-06 14:29:00 · 546 阅读 · 0 评论 -
背包问题模板
01背包模板int main() { int i, j, n, m; while(scanf("%d",&n)!=EOF) { scanf("%d", &m); for(i=0; i<n; i++) scanf("%d%d", &wei[i],&val[i]);//wei[i]为重量,v转载 2017-04-24 08:48:33 · 311 阅读 · 0 评论 -
矩阵运算总结
#define LL __int64 using namespace std; const int MAXN = 5; // 矩阵的最大行和列 const int MOD = 1e5; // 如果可以不用取模,则尽量不用 const double eps = 1e-6; // 处理细小的转载 2017-05-02 19:12:12 · 624 阅读 · 0 评论 -
图论-网络流
最大流#include #include #include #include #include #include #include using namespace std; const int N = 1100; const int INF = 0x3f3f3f3f; struct Node { int to;//终点原创 2017-04-30 15:48:51 · 293 阅读 · 0 评论 -
图论-最小生成树算法
Prim算法void prime() { int i,j,min,mindis=0,next; memset(tree,0,sizeof(tree)); for(i=1;i<=point;i++) { lowdis[i]=map[begin][i];//用lowdis[]数组记录下从起点到剩下所有点的距离 }原创 2017-04-29 23:10:53 · 346 阅读 · 0 评论 -
堆的操作
堆就是优先队列,每次取都是权重最小最大数typedef struct HNode *Heap; /* 堆的类型定义 */struct HNode { ElementType *Data; /* 存储元素的数组 */ int Size; /* 堆中当前元素个数 */ int Capacity; /* 堆的最大容量 */};typedef原创 2017-04-29 23:37:58 · 266 阅读 · 0 评论 -
AVL旋转操作详解
第一种旋转方式是LL类型,如图所示:k2的左边比右边高了2,说明X的高度比Z高1代码如下void LL_Rotate(AVLNode* &p) { AVLNode * lc = NULL; lc = p->lchild; //lc指向p的左子树根结点 p->lchild = lc->rchild; //lc的右子树挂接原创 2017-05-13 15:11:35 · 720 阅读 · 0 评论