- 博客(14)
- 资源 (2)
- 收藏
- 关注
原创 SPFA
建立一个队列,初始时队列里只有起始点,再建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图){CSDN:CODE:228856
2017-03-24 14:50:26 169
原创 Bellman-Ford模板
Dijkstra算法无法判断含负权边的图的最短路。如果遇到负权,在没有负权回路存在时(负权回路的含义是,回路的权值和为负。)即便有负权的边,也可以采用Bellman-Ford算法正确求出最短路径。主要是做N次松弛,用变量记录入队列的次数和是否入过队列,如果每次都如队列则判定有负环#include #include #include #include #include #includ
2017-03-24 14:09:07 293
原创 Floyd(各对顶点之间的最短距离)
我们其实可以求n次Dijkstra,就可以求出各对顶点的最短路了。但是这不是重点,有一个比他更清晰易懂的算法—Floyd假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t#include #include #include #include
2017-03-24 11:51:59 968
原创 Aho-Corasick 多模式匹配算法
核心思想简介KMP算法一样, AC自动机在匹配时如果当前字符匹配失败,那么利用fail指针进行跳转。由此可知如果跳转,跳转到的串的前缀,必为跳转前的模式串的后缀。由此可知,跳转的新位置的深度一定小于跳之前的节点。所以我们可以利用 bfs在 Trie上面进行 fail指针的求解。 设这个节点上的字母为x,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也有字母为x的节点。然后把...
2017-03-23 17:42:48 413
原创 Trie树
https://vjudge.net/problem/UVALive-3942前缀树:#include #include #include #include #include #include #include #define max_length 300100#define sigma_size 27#define MODE 20071027#define max_
2017-03-23 15:34:21 173
原创 KMP(前缀数组)
KMP简洁:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。举个例子吧!举例来说,有一个字符串"
2017-03-23 14:43:59 715
原创 堆排序
维护一个完全二叉树.这个是一个小根堆的实现#include#include#include#define maxn 200using namespace std;int arr[maxn];void upAdjuest(int a[], int pos) { int temp = a[pos]; int j = (pos - 1) / 2; while
2017-03-21 18:17:51 164
原创 快速排序
快速排序其实就是冒泡的一种改进版本.他是不稳定的一种排序方法.合理的用分治的思想处理排序问题.#include #include #include #define maxn 1<<10using namespace std;int arr[maxn];void qsort(int a[],int left,int right) { if(left >= rig
2017-03-20 22:48:07 159
原创 avl 平衡二叉树
实现平衡二叉树参考博客:http://blog.csdn.net/whucyl/article/details/17289841参考博客:http://www.cnblogs.com/QG-whz/p/5167238.html个人实现代码:#include #include #include using namespace std;struct BinaryTreeNo...
2017-03-19 13:25:08 244
原创 循环队列的简单实现
#include #include #include #define maxn 20#define add_length 5using namespace std;typedef struct Node{ int rear; int front; int size; int *data;}*LoopQueue;void Init(LoopQueu
2017-03-17 17:15:08 224
原创 链队列简单实现
实现的时候遇到了简单问题。传指针进去才行。#include #include #include #define maxn 20using namespace std;typedef struct QNode { int data; struct QNode *next;}QNode;typedef struct LinkQueue{ QNode * fr
2017-03-16 22:07:06 182
原创 栈的简单实现
栈的简单实现#include #include #include #define max_stack_length 20#define append_stack_length 5using namespace std;typedef struct { int *base; int *top; int stackSize;}SqStack;///初始化栈
2017-03-08 22:41:14 164
原创 双链表实现
在实现双端链表的时候,由于图简单,没加哨兵。导致删除节点的时候出现free首节点无法删除。原因是:引用 这篇博客 http://blog.csdn.net/llhyy17/article/details/5375298需要将头节点往前移一个数据类型占用的内存大小。然后将这个地方的位置标记为可以使用的。这个时候就出现了内存访问非法了。 #include #include #inc
2017-03-07 21:14:58 198
原创 单链表的简单实现
#include #include #include #define max_list_length 20#define expand_list_length 5using namespace std;#include#include typedef struct Node { struct Node *next; int value;} Node, *List;
2017-03-05 21:14:24 162
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人