算法
文章平均质量分 69
棋煜
这个作者很懒,什么都没留下…
展开
-
bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路
转载链接:http://www.wutianqi.com/?p=1912Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Ric转载 2015-11-09 10:37:51 · 2610 阅读 · 0 评论 -
tarjan算法求最大强连通 网络上的解释+自己的想法
转自网络:FJ:low数组是记录能到达最小的节点,也就是一直搜到低,这时候返回值,最后一个节点j搜到了i,而且i在栈中,就是已经访问的点,那么low[j]是min(low[j],dfn[i]);其实low[j]就等于了dfn[i]了,那么j返回前一个节点的时候,j上面的所有节点的low都等于dfn[i],那么这就是一个强连通了。[有向图强连通分量]在有向图G中,如果两个顶点间至少存转载 2015-11-13 16:07:50 · 609 阅读 · 0 评论 -
Kosaraju算法求最强连通分量
首先解释一下强连通分量。有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。上面是百原创 2015-11-11 18:06:15 · 555 阅读 · 0 评论 -
邻接表保存图
先来一张图表示下大概的保存形式:如同上图:下面代码给出详细的解释,代码是根据HDU2376写的:#include#include#includeusing namespace std;#define maxn 10010struct Node{ int v,next,value;//v是结点,next是记录与i相连的下一个节点所在边的下标} edge[maxn原创 2015-11-09 11:17:40 · 393 阅读 · 0 评论 -
SPFA算法
SPFA算法是计算单源最短的问题,当出现负环的时候,dijkstra就没用了,然后bellman-ford算法又复杂度过高,而spfa能很好的解决这个问题。SPFA算法的不同之处就在他用一个数组保存了每个点的进栈次数,如果进栈次数超过了结点数,那么说明存在负环,返回-1;下面贴上网上的SPFA算法模板和网上的讲解,有DFS和BFS实现的两种:粗略讲讲SPFA算法的原理,SPFA算法原创 2015-11-09 11:12:04 · 619 阅读 · 1 评论 -
KMP
KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。 什转载 2015-11-09 10:51:10 · 355 阅读 · 0 评论 -
dijkstra 解决单元最短路(无负权)
算法思路:dijkstra算法是把结点分为两个集合,一个是已经求出最短路的集合S,另一个就是其他结点的集合U,一开始S只有源结点V0,dijkstra算法就是不断的冲U集合中找出离中转点最近的点,然后把它加入到S集合中,加入后更新U集合的数据。模拟一遍:一开始只有S只有v0源点,然后在U集合中找到了离v0最近的结点k,把k加入到S中,并把U中的结点数据更新。更新规则如下:if(dist[u]+原创 2015-11-09 10:49:43 · 560 阅读 · 0 评论 -
Qsort对二位数组的排序
#include #include int cmp(const void *a,const void *b){ return((int*)a)[1]-((int*)b)[1];}int main(){ int t,n,i,x1; int m[1005][2]; scanf("%d",&t); for(i=1;i<=t;i++) {原创 2015-11-09 11:08:46 · 315 阅读 · 0 评论 -
vector C++ 函数库用法
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。1 基本操作(1)头文件#include.(2)创建vector对象,vector vec;(3)尾部插入数字:vec.push_back(a);(4)使用下标访问元素,cout(5)使用迭代器访问元素. vectorint>::iterator it;for(it=vec.begi转载 2015-11-09 11:03:44 · 463 阅读 · 0 评论 -
状压DP
状态压缩DP:状态压缩最重要的一个知识就如何运用位运算,有关位运算的知识:含义 Pascal语言C语言Java按位与a and ba & ba & b按位或转载 2015-11-09 11:05:20 · 310 阅读 · 0 评论 -
deque 双向队列
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数:/双向队列 deque//by MoreWindows http://blog.csdn.net/morewindows#include #include #inclu转载 2015-11-09 11:01:14 · 282 阅读 · 0 评论 -
STL中的二分查找——lower_bound 、upper_bound 、binary_search
C++ 二分查找很简单,原理就不说了。STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提)。 其中如果寻找的value存在,那么lower_bound返回一个迭代器指向其中第一个这个元素。upper_bound返回一个迭代器指向其中最后一个这个转载 2015-11-09 11:00:14 · 544 阅读 · 0 评论 -
字典树(讲解+模版)
字典树(讲解+模版)又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一转载 2015-11-09 10:54:18 · 315 阅读 · 0 评论 -
Kruskal算法
1.概览Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。 2.算法简单描述1).记Graph中有v个顶点,e个边2).新建图Graphnew转载 2015-11-09 10:47:39 · 1198 阅读 · 0 评论 -
匈牙利算法—解决二分图最大匹配问题
先来一份网上比较简单易懂的讲解:匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。-------等等,看得头大?那么请看下面的版本:通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世转载 2015-11-09 10:45:59 · 637 阅读 · 0 评论 -
比匈牙利算法更好的算法——Hopcroft-Carp算法
看这篇前请了解匈牙利算法,该算法是在匈牙利算法的基础上的优化。是利用BFS形成多条增广路的算法。 下面介绍一下Hopcroft-Karp算法,这个算法的时间复杂度为O(n^(1/2)*m)。该算法是对匈牙利算法的优化,如图1-图7,利用匈牙利算法一次只能找到一条增广路径,Hopcroft-Karp就提出一次找到多条不相交的增广路径(不相交就是没有公共点和公共边的增广路径),然后根据这些增广路径转载 2015-11-09 10:44:08 · 3906 阅读 · 0 评论 -
【经典算法】——KMP,深入讲解next数组的求解
本部分内容转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许转载 2016-04-27 16:39:07 · 385 阅读 · 0 评论