算法学习之路
文章平均质量分 68
codenupt
这个作者很懒,什么都没留下…
展开
-
gdb调试简单明了,转载
----------------------------------------------原文链接本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者。GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完转载 2015-02-02 15:35:24 · 231 阅读 · 0 评论 -
最小生成树Kruskal算法实现+快排实现权值排序
要求要最少的边让图连通(任意两点之间可以互相到达)。要想让n个顶点的图连通,那么至少需要n-1条边。其实这里就是求一个图的最小生成树基本思路:首先按照边的权值进行排序按照升序,每次从剩余的边中选择权值较小且边的两个顶点不在同一个集合内的边(将所有的顶点放入一个并查集中,判断两个顶点是否连通,只需判断两个顶点是否在同一个集合中,即是否有共同的祖先,这样时间复杂度为O(logN))(就是不会产原创 2015-04-15 20:39:57 · 1376 阅读 · 0 评论 -
最大子矩阵面积
http://blog.csdn.net/sunmenggmail/article/details/7709004#includeusing namespace std;int f[2001][2001];int h[2001],l[2001],r[2001];int n,i,j;int main(){ cin>>n; int w; for(i=1;i<=n;i++)转载 2015-04-16 20:53:16 · 1052 阅读 · 0 评论 -
华为机试地铁换乘C++实现(不容易啊)
描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A原创 2015-04-17 16:32:05 · 1856 阅读 · 0 评论 -
Floyed多源节点--最短路径C++实现与实现打印路径
基本想法:令d [i, j, k]表示从i 到j 的最短路径的长度,其中k 表示该路径中的最大顶点,也就是说d[i,j,k]这条最短路径所通过的中间顶点最大不超过k。最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转。。。。允许经过n号所有顶点进行中转,求任意两点之间的最短路径。概况:从i号顶点到j号顶点只经过前k号点的最短路径。也就是两个点之间的距离将会中转所有的顶点原创 2015-04-13 17:08:36 · 855 阅读 · 0 评论 -
DijkStra最短路径的C++实现与输出路径
一个点(源点)到其余各个顶点的最短路径。也叫做“单源最短路径”Dijkstra。Dijkstra的主要思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径用flag标示该点是否在离源点最近的集合中算法步骤:1.初始时,S只包含源点,即P={v},v的距离为0。U包含除v外的其他顶点,即:Q={其余顶点},若v与U中顶点u有边,则正常有权原创 2015-04-13 19:34:33 · 12680 阅读 · 0 评论 -
汉诺塔的简单实现
一直认为很简单的递归经典算法,感觉有时转不过来,特意写了一个#includeusing namespace std;void move(int n,char from,char to){ cout<<n<<" from "<<from<<" to "<<to<<endl;}void Hanno(int n,char f,char temp,char t)//从什么到什么,剩下的就是中间原创 2015-07-07 16:49:39 · 399 阅读 · 0 评论 -
最短路径比较
FloydDijkstraBellman-Ford队列优化的Bell.空间复杂度O(N^2)O(M)O(M)O(M)时间复杂度O(N^3)O((M+N)logN)O(NM)最坏也是O(NM适用情况原创 2015-04-14 13:00:50 · 292 阅读 · 0 评论 -
最大子矩阵全1的个数
/*方法是:1、先将0/1矩阵读入x,对每一个非零元素x[i][j],将其更新为:在本行,它前面的连续的1的个数+1(+1表示算入自身) 比如,若某一行为0 1 1 0 1 1 0,则更新为0 1 2 0 1 2 02、对每一个非零元素x[i][j],在第j列向上和向下扫描,直到遇到比自身小的数,若扫描了y行,则得到一个大小为x[i][j]*(y+1)的全1子矩阵(+1表示算入自身原创 2015-08-13 15:35:13 · 1174 阅读 · 0 评论 -
最小生成树之Prim算法C++实现
Prim算法的基本思路:将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。#includeusing namespace std;i原创 2015-04-16 14:38:05 · 9237 阅读 · 5 评论 -
图的遍历之-DFS深度优先遍历C++实现
深度优先遍历的思想:沿着图的某一个分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止:首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。求出上图各个顶点到各个顶点的路径#includeusing namespace std;原创 2015-04-14 20:27:39 · 2694 阅读 · 0 评论 -
图的遍历之BFS广度优先遍历C++实现
首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。广度优先遍历更加适用于所有边的权值相同的情况#include#includeusing namespace std;int main(){ int points,edgs; cin>>points>>edgs; i原创 2015-04-14 22:01:59 · 2913 阅读 · 0 评论 -
关于图的邻接表C++实现
first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因为没有边加入所有都是-1.即first[u[i]]保存顶点point1[i]的第一条边的编号,next[i]存储“编号为i的边”的“下一条边”的编号。next[i]=first[point1[i]];//first[]存储的是顶点的编号first[point1[i]]=i;//next[]存储的是第i条原创 2015-04-14 10:17:28 · 477 阅读 · 0 评论 -
奥数等式:暴力穷举法
奥数等式:暴力穷举法abc+def=hig 将数字1~9分别填入,每个数字只能使用一次使得等式成立。例如784+152=936就是一个合理的组合,请问一共有多少种合理的组合?注意784+152=936和152+784=459是同一种组合。根据枚举思想我们只需要枚举每一位上所有可能的数就好了。用一个flag数组来标记解决互不相等的问题。#includeusing namespa原创 2015-04-15 10:17:52 · 776 阅读 · 0 评论 -
Bellman-Ford存在负权的最短路径C++实现
核心思想:对所有的边进行n-1次“松弛”操作只需要进行n-1(n为顶点数)轮就可以了。因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边。Bellman-Ford算法的时间复杂度为O(NM)。#includeusing namespace std;int main(){ int dis[10]; int infinity=99999999;原创 2015-04-13 21:44:27 · 474 阅读 · 0 评论 -
Bellman算法优化使用邻接表C++实现
用临接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度也是O(M),如果一个图是稀疏图的话,M要远小于N^2,因此稀疏图选用邻接表来存储比用邻接矩阵来存储好很多。#include#includeusing namespace std;int main(){ int points,edgs; cin>>points>>edgs; int point1[10],poin原创 2015-04-14 12:33:35 · 380 阅读 · 0 评论 -
C++基础知识点遗忘二字符与树的遍历节点判断
1.关于转义字符 char a='\72' 并不会报错 7代表的是八进制 \o72 代表冒号: 如果是\92就会出错 十进制2.前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?第一步,root最简单,前序遍历的第一节点G就是root。第二步,观察前序遍历GDAFEMHZ,原创 2015-04-16 10:38:46 · 391 阅读 · 0 评论 -
迷宫BFS实现
#includeusing namespace std;struct note{ int x; int y; int f; int count;};int main(){ struct note que[2501]; int num[51][51]={0},flag[51][51]={0}; int diretion[4][2]={{0,1},{1,0},{0,-1},{原创 2015-04-15 14:22:00 · 296 阅读 · 0 评论 -
奥数等式与走迷宫Dfs实现
深度优先搜索(Depth First Search,DFS),理解深搜的关键在于解决“当下该如何做”。至于“下一步如何做”。通常的方法就是把每一种可能都是尝试一遍。当前这一步解决后便进入下一步。下一步的解决方法和当前这步的解决方法是完全一样的。深搜的基本模型:void dfs(int step) { 边界判断 尝试每一种可能 for(i=1;i<=n;i++)原创 2015-04-15 11:14:21 · 556 阅读 · 0 评论 -
图的割点与割边实现
基本思路:假如我们在dfs时访问到了u点,此时图就会被u点分割成为两部分。一部分是已经被访问过的点,另一部分是没有被访问过的点。如果u点是割点,那么剩下的没有被访问过的点中至少有一个点在不经过u点的情况下,是无论如何再也回不到已经访问过的点了。假如到了u后,图中还有顶点v是没有访问过的点,如何判断v在不经过u的情况下是否还能回到之前访问过的任意一个点?u是v的父亲,而之前访问过的顶点就是祖先。原创 2015-04-16 19:15:11 · 570 阅读 · 0 评论