
ACM
咕咕咕~
这个作者很懒,什么都没留下…
展开
-
字典树
字典树JAVA版本TrieNodeclass TrieNode { private TrieNode[] links; private final int R = 26; private boolean isEnd; public TrieNode() { links = new TrieNode[R]; } publ...转载 2020-01-14 14:25:29 · 110 阅读 · 0 评论 -
跳跃表
跳跃表SkipListimport java.util.Random;public class SkipList<E extends Comparable<? super E>> { /* * 跳表层数32层: 定义成32层理论上对于2^32-1个元素的查询最优。 */ private final int MAX_LEVEL =...转载 2020-01-14 10:01:18 · 184 阅读 · 0 评论 -
图论-Bellman-Ford
Bellman算法1.单源最短路径2.有向图&无向图3.边权可正可负(负权回路);4.差分约束系统;不断更新最短距离,若某次没有对Dist进行更新,说明最短路径已经查找完毕,或者部分点不可达,此时跳出循环。struct edge{int from,to,cost};edge es[N]; //边int d[N],V,S; //最短距离,顶点数,边数void be...原创 2019-06-08 17:00:25 · 189 阅读 · 0 评论 -
图论-floyd
Floyd算法其实是动态规划的思想// 初始化 g 矩阵为0和infvoid floyd() { for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (g[i][...原创 2019-06-08 17:02:56 · 162 阅读 · 0 评论 -
图论-spfa
SPFA算法可处理负权,但不能处理负环,能判断负环维护一个队列,初始时队列里只有起始点,记录起始点到所有点的最短路径。不断松弛,用队列里有的点作为起始点去更新到所有点的最短路,如果更新成功且被更新的点不在队列中则把该点加入到队列。重复执行直到队列为空跳出循环。记录每个顶点入队次数,若某点入队超过n次,则存在负环。bool inq[MAX_N];int cnt[MAX_N]; //记录每...原创 2019-06-08 17:13:58 · 183 阅读 · 0 评论 -
图论-tarjan
Tarjan算法一个图是否连通可以通过tarjan算法搞定。结点public class vertexNode { /* * 边的链式存储 * */ public int v; //起点 public int next; //终点 }java实现算法,垃圾代码…package alo_Graph;public class Graph_Tarjan { sta...原创 2019-06-08 17:24:16 · 246 阅读 · 0 评论 -
排序-拓扑排序
拓扑排序拓扑排序(topological-sort)是指由某个集合上的一个偏序得到该集合上的一个全序的操作。拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。简单来讲就是我要做ABCD四件事,我想要做A,但是我发现我得先做B或C,好吧那我随便选一个吧!先去做C,但是我又发现要想做C...原创 2019-06-09 21:36:43 · 300 阅读 · 0 评论 -
树-线段树
线段树基础线段树是一个完全二叉树,在各个节点(1-n)保存一个线段,由于整体是二叉树的构造,可以保证查询的效率。构建出来的树如上所示,每个结点均对应一段线段。树的结点信息储存在索引为1-7的数组空间里。例1:求数组中某区间的最小值很明显我们要先建树,并且在建树回溯的时候把信息赋给各个结点。#include<iostream>using namespace std;in...原创 2019-06-11 12:15:19 · 145 阅读 · 0 评论 -
简单背包问题
背包问题初始化正好装满 f[0] = 0,f[1-n] = inf不需要装满 f[0-n] = 00-1背包n件物品(每件只有一个)容量为m的背包,求最大价值二维解法 f[i][j]表示前i件物品,总重量不超过j的最大价值 for(int i=1;i<=n;i++){ for(int j=m;j>0;j--){ ...原创 2019-08-07 19:27:02 · 242 阅读 · 0 评论 -
图论-kruscal
Kruscal算法每个顶点一棵树,并将边按权重升序排列。然后从前到后按循序选边,如果当前选择的边的两个顶点分在两棵不同的树中,则将该边加入到最小生成树中,并合当前边连接的两棵树,如果边的两个顶点在相同的树中,则不做任何处理。跟着思路java敲了一遍//排序调用该方法比较图中边的大小 static boolean cmp(edge a, edge b){ return a.w &l...原创 2019-06-08 16:43:47 · 206 阅读 · 0 评论 -
图论-prim算法
prim算法索引1-n,初始化所有结点未访问且距离为到第一个点的距离,然后从第一个点开始跑贪心算法。每一次找一个离当前已访问结点集合 最近的 未访问 的点u。访问u,更新所有 未访问 离(当前结点集合+u)更近的结点距离。找n次结束。void Prim(){ int i,j,k,tmp,ans; for(i=1;i<=n;i++) dis[i]=inf;//初始化 dis...原创 2019-06-08 16:33:21 · 223 阅读 · 0 评论 -
排序-快速排序
快速排序版本一int Partition(int a[], int low, int high){ int x = a[high];//将输入数组的最后一个数作为主元,用它来对数组进行划分 int i = low - 1;//i是最后一个小于主元的数的下标 for (int j = low; j < high; j++)//遍历下标由low到high-1的数 ...原创 2019-05-30 22:19:43 · 137 阅读 · 0 评论 -
图论-dij
dij数组版本int g[200][200],dist[200],visit[200];int vertex,pos,minn;void dij(int s){ for(int i=0;i<vertex;i++)dist[i]=100000; memset(visit,0,sizeof(visit)); for(int i=0;i<vertex;i++)d...原创 2019-05-31 11:06:16 · 436 阅读 · 0 评论 -
图论-存图方式
邻接矩阵二维矩阵存储,是最直接的存图方式int g[n][n];邻接表 //将起点为"i "的链表清空 e[i].clear(); //增加顶点"i"到顶点"j"的边 e[i].push_back(j); //查询以"i"为起点的第"j"条边 e[i][j]; //寻找权值为k的边 for (int j = 0...原创 2019-05-31 18:41:27 · 937 阅读 · 0 评论 -
排序-基本排序方法
插入排序void insertSort(int a[],int n){ for(int i=1;i<n;i++) { for(int j=i;j>0;j--) { if(a[j]>a[j-1]) { swap(a,j,j-1); ...原创 2019-06-02 14:47:12 · 244 阅读 · 0 评论 -
树-AVL最优二叉树
AVL树#include<iostream>using namespace std;class Node{public: int data; Node* left; Node* right; Node():left(NULL),right(NULL),data(0){} Node(int data):data(data),left(NU...原创 2019-06-02 14:52:22 · 346 阅读 · 0 评论 -
树-哈夫曼树
权值哈夫曼树template<class type>class Node{ type data; Node* leftChild; Node* rightChild;};#define MAX 255template<class type>class BinaryTree{public: BinaryTree(){ ...原创 2019-06-02 14:55:30 · 206 阅读 · 0 评论 -
树-二叉搜索树
二叉搜索树#include<iostream>using namespace std;template<class type>class Node{ type data; Node<type>* leftChild,rightChild,parent; Node(type key):data(key){}};template...原创 2019-06-02 14:57:02 · 197 阅读 · 0 评论 -
排序-归并排序
归并排序归并排序本质上是分治法,就是在递归回溯回来的时候把数组排好序。void MergeSort1(int *a, int p, int r){ if (p<r){ int q = (p+r)/2; MergeSort1(a, p, q); MergeSort1(a, q+1, r); int n1 = q-p+1; int n2 = r-q; ...原创 2019-05-30 21:06:35 · 161 阅读 · 0 评论