- 博客(31)
- 收藏
- 关注
原创 最短路径算法对比分析
N代表顶点个数,M代表边的条数.Floyd算法虽然总体时间复杂度,但是可以解决负权边(不能解决负权环,实际上这几种都无法解决负权回路,因为一直循环下去总能找到更小的路径),并且均摊到每一点对上,在所有的算法中还是比较好的. Floyd算法代码复杂度小也是一大优势. Dijkstra算法最大的弊端就是无法适应有负权边的图,但Dijkstra具有很好的可扩展性,另外在Dijkstra算法在选择剩余
2014-12-06 12:41:36
995
1
原创 SPFA——基于Bellman-Ford的队列优化
Bellman-Ford算法在每一次实施松弛操作时,就会有一些顶点已经求得最短路径,此后这些顶点的最短路径的估计值就会一直保持不变,不再受后续松弛操作的影响,但是每次还要判断是否需要松弛,这里浪费了大量的时间.SPFA(Shortest Path Faster Algorithm)是基于Bellman-Ford算法的改进,每次进队最短路径估计值发生变化了的顶点的所有出边执行松弛操作,借助一个队
2014-12-05 16:15:08
1889
原创 Bellman-Ford——解决负权边
Dijkstra算法虽好,但是不能解决带负权边的图,而Bellman-Ford就是解决这个问题的在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边,最短路径中不可能包含回路.最短路径是一个不包含回路的简单路径,回路分为正权回路(回路权值之和为正)和负权回路(回路权值之和为负). 如果最短路径中包含正权回路,那么去掉这个回路,一定可以得到更短的路径;如果最短路径中包含
2014-12-04 22:59:03
1278
原创 Dijkstra算法——通过边实现松弛
算法思想:每次找到离源点最近的顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径.时间复杂度是O(N^2).基本步骤:将所有的顶点分为两部分,已知最短路程的顶点集合S和未知最短路径的顶点集合V. 最开始,已知最短路径在集合S中只有源点一个顶点,用book数组来标记哪些点在集合S中.设置源点p到自己的最短路径为0(即dis[p] = 0). 若存在有源点能直接到达的
2014-12-04 20:31:31
1227
原创 只有五行的算法——Floyd-Warshall
基本思想:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转......允许经过1~n号所有顶点进行中转,求任意两点之间的最短路径. 用一句话概括就是:从 i 号顶点到 j 号顶点只经过前 k 号点的最短路径. 时间复杂度O(N^3).Code:#include #include #include #define INF 999999int main(int
2014-12-04 00:11:26
1127
原创 最少转机——图的广度优先遍历
摘自《啊哈算法》:小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有直接到5号城市的直航. 不过小哼已经收集到了很多航班的信息,现在小哼希望找到一中乘坐方式,使得转机的次数最少?Solution:深度优先遍历是不可以啊,DFS的思想会使得遍历的不一定是最少的可以运用BFS思想Code:#include #include #inc
2014-12-01 22:14:59
1794
原创 广度优先遍历 BFS C实现
广度优先遍历的主要思想:首先以一个未被访问的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有的顶点都被访问过,遍历结束.Code:#include #include #include #define INF 999999int book[100];int main(int argc, char const *a
2014-12-01 14:21:16
979
原创 深度优先遍历 DFS C实现
深度优先遍历DFS, 同样适用于求出连通分量个数Code:#include #include #include #define INF 999999int book[101], e[101][101]; /// book 数组代表顶点是否被访问int sum, n;void dfs(int cur){ int i; printf("%d ", cur)
2014-12-01 13:49:39
937
原创 回文 栈实现
Code:#include #include #include int main(){ char str[100], s[100]; int i, len, mid, top; gets(str); len = strlen(str); mid = len/2 - 1; top = -1; for (i = 0; i <= mid; ++i) { s[+
2014-11-22 14:21:08
798
原创 KMP算法 C实现
KMP Code:/******************************************************************* Theme: KMP算法* Content:* Language: C* Author: Aesthetic92* Description:************************
2014-11-21 19:39:17
763
原创 堆排序
Code:#include #include void Adjust_heap(int array[], int pos, int n){ int i, temp; for(i = 2 * pos; i <= n; i *= 2) { if(i < n && array[i] < array[i+1]) {
2014-11-19 23:40:23
451
原创 Hash Table 开放寻址处理冲突
Code:#include using namespace std;const int p = 7;const int N = 8;int T[N];/// 初始化void hash_init(){ for (int i = 0; i < N; ++i) { T[i] = -1; }}/// 开放寻址int hash_fun(i
2014-11-19 23:35:44
589
原创 可以学习的计算机书籍
基础篇1、c程序设计语言2、c和指针3、c缺陷与陷阱4、c专家编程5、组成原理(大学课本)6、操作系统(大学课本)7、编译原理(龙书)8、CCNA学习指南9、深入理解计算机系统10、数据结构11、算法导论中级篇c++部分12、c++primer13、c++标准库14、超越c++标准库15、深度探索C++对象
2014-09-08 09:53:36
640
原创 迭代器失效
对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。这是因为顺序容器内存是连续分配,删除 一个元素导致后面所有的元素会向前移动一个位置。但是erase方法可以返回下一个有效的iterator。
2014-06-06 21:25:11
525
原创 未来1~2年计划
第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内)
2014-06-06 19:50:08
900
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人