随笔分类 - 算法笔记
摘要:优先队列(priority queue) 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。 首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~关于priority_queue1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素. 调用pop()删除之后,将促使下一个元素进入该位置.2,如同stack和queue,priority_queue是一个基于基本序列容器进行构建的适配器,.
阅读全文
摘要:bellman-ford算法资料链接http://hi.baidu.com/kerrynit/item/f16bfbd465dc6b87270ae772STL资料链接http://net.pku.edu.cn/~yhf/UsingSTL.htm资料链接http://blog.csdn.net/byxdaz/article/details/4633826计算几何 基础篇资料链接http://www.cnblogs.com/jbelial/archive/2011/08/04/2127487.html计算几何 模板资料链接http://blog.csdn.net/mindmb/article/de
阅读全文
摘要:欧几里德算法也就是一般说的辗转相除法。代码框架如下:int gcd(int a, int b) { return b ? gcd(b, a%b) : a;}粗略估计需要进行O(log b)次整数运算。实际上,当n固定后gcd(m, n)的平均迭代次数(m <= n)近视为(12*ln2 / π2)*ln(n) 。(不知道怎么证明的-_-!) 扩展欧几里德算法 设gcd(a, b) = d,则存在正整数x, y满足ax + by = d。算法框架int x, y;int ext_gcd(int a, int b) { if(b == 0) { x = 1; y = ...
阅读全文
摘要:long long merge_sort(int l, int r) { int mid, p, q, i, j, len; if(l >= r) return 0; mid = (l + r) >> 1; len = r - l + 1; p = l; q = mid + 1; j = l; for(i = 0; i < len; ++i) { if((q > r) || (num[p] < num[q] && p <= mid)) { t[j++] = num[p++]; } else { ...
阅读全文
摘要:下图说的很清楚,每次找入度为0的点,将其从序列中删掉,同时与它相连的所有点入度减一;实现代码,以HUD_1285为例:#include <iostream>#include <cstdio>using namespace std;const int N = 501;int map[N][N];int into[N], ans[N];void toposort(int x){ int i, j, k; for(i = 1; i <= x; i++) for(j = 1; j <= x; j++) if(map[i][j]) ...
阅读全文
摘要:并查集(Union-Find Sets),字面意思理解——合并,查找。给出一个集合,将其合并后用一个点代替一个集合的元素。例如:1 22 34 3合并后就是 2 / \1 3 \ 4主要操作:1、查找。2、合并。查找方法见http://www.cnblogs.com/vongang/archive/2011/07/31/2122763.html合并实现方法如下:void Union(int root1, int root2){ int x = FindSet(root1), y = FindSet(root2); if( x == y ) return ; if( r...
阅读全文
摘要:struct node{ int v; //边的结束顶点int w; //边的长度 node* next; //指向以同一起点的下一条边的指针}*first[N]; //first[u]指向以u为起始点的第一条边void init(){ memset(first,NULL,sizeof(first));}void add(int u, int v, int w)//添加边{ node* p =new node; p->v = v; p->w = w; p->next = fisrt; first[u] = p;}//使用的时候,找u的邻接点for(node* p...
阅读全文
摘要:当对很大的数(比如100位)进行运算时,肯定不能c/c++内的数据类型直接运算(当然Java里的BigNumber可以。。。)这时就要用数组模拟运算过程。+, - ,*, /,运算貌似是小学学的东西,童鞋们,现在要用到小学的知识啦!!先说加法,大体的操作包括逆序、对位、求和、进位(其实就是小学的加法运算,不过是把数倒过来算,至于为什么要逆序。。。)例题:http://poj.grids.cn/practice/2981代码:#include <stdio.h>#include <string.h>#define MAX 200int an1[MAX+10];int an
阅读全文
摘要:堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i
阅读全文
摘要:快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):1、取一个关键字;2、把序列中大于关键字的放在关键字右边;3、把序列中小于关键字的放在关键字左边;4、重复1-3步,直到序列有序;代码+注释:#include<stdio.h>#define N 100int QuickSort1 (int r[], int low, int high){ int key; key=r[low]; /*取轴值记录关键字*/ while(low<high) /*从表的两端交替地向中间扫描*/ { while(low<high && r[high]...
阅读全文
摘要:二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。如图:链表实现(比较简单):View Code #include <stdio.h>#include <malloc.h>typedef struct node{ int data; struct node * lchild; struct node * rchild;}node;void Init(node *t){ t = NULL;}node * Insert(node *t , int key
阅读全文
摘要:栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如BFS, SPFA。。。)栈主要操作有:入栈Push;取栈顶Get_Top;出栈(删除栈顶元素)Pop;栈的数组实现(代码非常简单,关键是思想)://数组实现#include <stdio.h>#include <malloc.h>#define maxsize 10typedef struct{ int data[maxsize]; int top; int base;}seqstack;seqsta
阅读全文

浙公网安备 33010602011771号