c++
文章平均质量分 69
zhongkeli
这个作者很懒,什么都没留下…
展开
-
floyd算法
这个算法主要要弄懂三个循环的顺序关系。弗洛伊德(Floyd)算法过程:1、用D[v][w]记录每一对顶点的最短距离。2、依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。算法理解:最短距离有三种情况:1、两点的直达距离最短。(如下图)2、两点间只通过一个中间点而距离最短。(图)3、两点间用通原创 2013-04-22 08:55:19 · 44482 阅读 · 3 评论 -
spfa算法
求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。简单的说就是队列优化的bellman-ford在路径中存在负权边是 dijkstra 就没法使用了 ,这是就可以SPFA 了但是当有负权的环是 就没有最短路,spfa 可以判断是否有负权环,如果没有就可以求出最短路。。期望的时间复杂度O(ke), 其中k原创 2013-04-23 19:54:03 · 889 阅读 · 0 评论 -
无向图判断环
方法:从一个顶点出发深度优先遍历可遍历所有结点,并且没有环或只有n-1条边。若判断有环:可以在遍历时记住父结点,v的子结点w已被访问,且不是结点v的父结点,则存在环。若判断只有n-1条边,循环一下很容易得到。用拓扑排序不可,因为无向图各顶点都有入度.假设不存在自环与平行边#include #include struct node原创 2013-04-15 09:08:17 · 3228 阅读 · 0 评论 -
kruskal 算法b
使用堆排序,并查集实现kruskal算法。堆排序算法见:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html并查集合:http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.html#include "iostream"#include原创 2013-04-23 10:35:49 · 925 阅读 · 0 评论 -
bellman-ford 算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。原创 2013-04-23 18:14:30 · 1248 阅读 · 0 评论 -
无向图的连通分量
无向图的连通分量一、对无向图进行遍历时(一)对于连通图,仅需要从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。(二)对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。 二、连通分量举例 (a) 无向图G3 (原创 2013-04-14 14:19:11 · 23784 阅读 · 0 评论 -
广度优先搜索
#include #include #include #include using namespace std;struct node /* 图顶点结构定义 */{ int vertex; /* 顶点数据信息 */ struct node *nextnode;原创 2013-04-14 13:04:59 · 1103 阅读 · 0 评论 -
判断无向图是否有环
判断N结点的无向图G是否有环假定:结点个数为M,边条数为E遍历一遍,判断图分为几部分(假定为P部分,即图有 P 个连通分量)对于每一个连通分量,如果无环则只能是树,即:边数=结点数-1只要有一个满足 边数 > 结点数-1原图就有环将P个连通分量的不等式相加,就得到: 所有边数 > 所有结点数 + 连通分量个数即: E +原创 2013-04-14 21:41:36 · 4862 阅读 · 0 评论 -
深度搜索
在http://www.cnblogs.com/yanlingyin/archive/2011/12/26/Depth-firstsearch.html 介绍了递归的深度搜索,写的比较好,最后我补充他的非递归方法。图是一种常见的数据结构,深度优先和广度优先搜索都是常用的算法,这篇博文先介绍深度优先搜索。和往常一样的,我会用朴实的语言来介绍它,所以只要认真看一定能理解。开始会先介原创 2013-04-12 21:58:56 · 9254 阅读 · 1 评论 -
horner法则求字符串散列值
#include "iostream"#include "string.h"using namespace std;int main(int argc, char const *argv[]){ int hash = 0; char *str = "abcdef"; for(int i = 0;i < strlen(str);i++){ hash = 31*hash + (int原创 2013-04-12 15:30:12 · 2594 阅读 · 0 评论 -
寻找有向图的环
在DFS中,递归调用的栈是记录当前正在遍历的有向路径如果找到一条边v->w并且w在栈中,此时就找到一个环,因为在栈中表示的是一条从w到v的有向路径,加上v->w,构成一个环。#include #include #include #include using namespace std;struct node /* 图顶点结构定义 *原创 2013-04-15 20:54:25 · 5759 阅读 · 1 评论 -
顶点深度优先次序
在调用dfs的过程中,几种添加顶点到集合的顺序。一共有四种顺序:Pre-Order,在递归调用dfs之前将当前顶点添加到queue中Reverse Pre-Order,在递归调用dfs之前将当前顶点添加到stack中Post-Order,在递归调用dfs之后将当前顶点添加到queue中Reverse Post-Order,在递归调用dfs之后将当前顶点添加到stack中原创 2013-04-16 16:19:48 · 1657 阅读 · 0 评论 -
0/1背包问题
1.引子 我们人类是一种贪婪的动物,如果给您一个容量一定的背包和一些大小不一的物品,裝到背包里面的物品就归您,遇到这种好事大家一定不会错过,用力塞不一定是最好的办法,用脑子才行,下面就教您如何解决这样的问题,以获得更多的奖品。2.应用场景 在一个物品向量中找到一个子集满足条件如下 : 1)这个子集加起来的体积大小不能大于指定阀值 2) 这个物原创 2013-04-25 09:55:56 · 934 阅读 · 0 评论 -
绝不重新定义继承而来的缺省参数值
在effective C++ 条款37:绝不重新定义继承而来的缺省参数值#include "iostream"using namespace std;class base{ public: virtual void fun(int i=1){ cout<<"base::"<<i<<endl; }};class derive:public base{private:原创 2013-10-31 09:10:18 · 1386 阅读 · 0 评论 -
A星八数码
#include#includeusing namespace std;struct node{ char num[9]; int gvalue; int hvalue; int fvalue; char action; node *parent; node *next;};node *openlist,*closelist,*bestnode;char start[9]原创 2011-11-19 19:14:10 · 1516 阅读 · 0 评论 -
类的作用域
类中的成员拥有类作用域,因此,在成员函数中可以直接引用类的数据成员。但是,如果在成员函数中定义了同名的局部变量时,则必须用作用域运算符“::”来指定。#include "iostream"using namespace std;class temp{private: int x;public: temp(arguments){ x = arguments; }; void原创 2013-05-28 09:35:41 · 755 阅读 · 0 评论 -
赋值函数和拷贝赋值函数
#include "iostream"using namespace std;class test{private: int data;public: test(int arg); test operator = (const test &temp);//赋值函数 test(const test &temp);//拷贝构造函数 /* data */};test::test(原创 2013-05-28 09:07:36 · 692 阅读 · 0 评论 -
KMP 算法
#include "iostream"#include "vector"#include "string"using namespace std;std::vector next;void get_next(string p){ int i = 0; int j = -1; next[0] = -1; while(i < p.size() - 1){ if(j == -1 |原创 2013-04-19 20:36:38 · 800 阅读 · 0 评论 -
无向图 割点
1.定义:割点:某个点是割点当且仅当删除该点和与该点相关联的边后图变得不连通。桥(割边):某条边是割边当且仅当删除该边后图变的不连通。双连通分支:图G的所有子图G'中,如果G'是连通的,则称G'是双连通子图。如果G'不是任何一个连通子图的真子图,那么图G'是双连通分支。特别的,点双连通分支又叫做块。2.求割点,桥对原图进行深度优先搜索,会生成一颗深度优先搜索原创 2013-04-26 15:10:09 · 1162 阅读 · 0 评论 -
dijkstral 算法
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那么二者是否等价呢?也就是说是否Dijkstra也可以计算出最小生成树而Prim也可以计算出从第一个顶点v0到其他点的最短路径呢?答案是否定的,否则就不必有两个算法了。原创 2013-04-17 20:23:47 · 1040 阅读 · 0 评论 -
prim算法
#include "iostream"#include "vector"#include "fstream"using namespace std;std::vector > weight;int vertexnum;int edgenum;void initialvector(){ weight.resize(vertexnum); for(int i = 0; i< ver原创 2013-04-17 13:11:52 · 767 阅读 · 0 评论 -
最长公共子序列
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。寻找LCS的一种方法是枚举X所有的子序列,然后注意检原创 2013-04-25 08:14:19 · 21504 阅读 · 2 评论 -
二叉查找数
#include using namespace std;template class treenode{ public: T key; int freq; treenode* lchild; treenode* rchild; treenode():lchild(NULL),rchild(NULL),freq(1){}};template class BST{原创 2013-04-12 08:56:46 · 1424 阅读 · 0 评论 -
三向切分快排
#include using namespace std;template void sawp(T a[],int first,int second){ T temp; temp = a[first]; a[first] = a[second]; a[second] = temp;}template int sort(T a[],int low,int high){ if(l原创 2013-04-11 19:50:45 · 2306 阅读 · 2 评论 -
结构体对齐
C/C++数据对齐为了避免混淆,做如下规定,以下代码若不加特殊说明都运行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为char占一个字节int占四个字节double占八个字节。两个例子请问下面的结构体大小是多少?struct Test{ char c ; int i ;};这个呢?转载 2011-11-22 22:47:27 · 6919 阅读 · 2 评论 -
数值范围
类型 长度 (bit) 有效数字 绝对值范围 float 32 6~7 10^(-37) ~ 10^38 double 64 15~16 10^(-307) ~ 10^308 long double 128 18~19 10^(-4931) ~ 10 ^ 4932转载 2011-11-01 20:26:24 · 521 阅读 · 0 评论 -
const char*和char const*以及char*const(转载)
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to转载 2011-11-20 21:39:16 · 615 阅读 · 0 评论 -
QueryPerformanceFrequency() - 基本介绍
类型:Win32API原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);作用:返回硬件支持的高精度计数器的频率。返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。QueryPerformanceFrequency() - 技术特点供WIN9X使用的高精度定时器:QueryPer原创 2011-11-19 14:01:52 · 791 阅读 · 0 评论 -
比较好的大整数四则运算
#includeusing namespace std; #define INT_BIT_MAX 255 #define FLOAT_BIT_MAX 255 #ifndef CONST #ifdef __cplusplus #define CONST const #else #define CONST转载 2011-11-19 14:05:14 · 2689 阅读 · 0 评论 -
高精度时间差计算代码
//高精度时间差计算代码#include "windows.h"using namespace std;class precisionTime{public: precisionTime(); void beginTime(); void endTime(); double processTime()const;private: LARG转载 2011-11-19 14:01:10 · 711 阅读 · 0 评论 -
排列递归
#include#define SWAP(a,b,t) ((t)=(a),(a)=(b),(b)=(t))void perm(char *list,int i,int n){ int j; int temp; if(i == n) //一个全排列已经完成,打印整个排列 { for(j = 0; j <=n; j++)转载 2011-10-29 22:06:04 · 447 阅读 · 0 评论 -
插入排序递归算法
#include#include#includetemplate void insert_sort_rec(T A[],int n){ int k; T a; n=n-1; if(n>0){ insert_sort_rec(A,n); a=A[n]; k=n-1; while(k>=0&原创 2011-10-29 18:53:10 · 1159 阅读 · 0 评论 -
trie树--详解
前几天学习了并查集和trie树,这里总结一下trie。本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串、判断前缀是否存在、查找字符串等基本操作;至于trie树的删除单个节点实在是少见,故在此不做详解。lTrie原理Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。lTrie性质好多人说转载 2011-10-29 20:23:29 · 918 阅读 · 0 评论 -
sizeof
在CU的C/C++版看到一个例子:http://bbs.chinaunix.net/thread-3621056-1-1.html#include stdio.h>struct A{ char a; char b; int c[0];};struct B{转载 2011-11-22 23:07:11 · 733 阅读 · 0 评论 -
开发库
C/C++ 开发库 | C/C++ Development Library这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,为各位 C/C++ 程序员和爱好者提供检索和查阅类库的方便下面收集的 C/C++ 类库介绍整理来源于文章:C++ 资源之不完全导引(作者:曾毅、陶文),这篇文章曾发表于 2004 年 5 月《CS转载 2011-11-22 23:17:48 · 2661 阅读 · 0 评论 -
const用法详解
const1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j; //非法,导致编译错误 j=i; //合法2. 必须初始化 const int i=5; //合法 const int j; //非法,导致编译错误3. 在另一连接文件中引用const常量 extern const int i; //转载 2011-11-25 16:12:37 · 495 阅读 · 0 评论 -
快排算法
#include using namespace std;template void quicksort(T a[],int low,int high){ int mid; if(low < high){ mid = partition(a,low,high); quicksort(a,low,mid-1); quicksort(a,mid+1,high); }}tem原创 2013-04-11 18:27:03 · 4890 阅读 · 0 评论 -
原地归并排序
原地归并排序所利用的核心思想便是“反转内存”的变体,即“交换两段相邻内存块”,对于反转内存的相关文章,曾在文章“关于反转字符串(Reverse Words)的思考及三种解法”中对一道面试题做了分析。这一思想用到的地方很多,在《编程珠玑》中被称为“手摇算法”。通过手摇算法的交换内存的思想来进行原地归并又有不少变种,我们举例分析一种比较常见的情况,不同的方法还有基于二分查找的方法来确定交换的内存块原创 2013-04-11 10:16:20 · 11207 阅读 · 4 评论 -
求二进制数中1的个数
#include using namespace std;const int larg = 100000;int main(int argc, char const *argv[]){ int n = 10; int num = 0; while(n){ n &= (n - 1);//每次去掉尾部的一个1 num++; } cout<<num<<endl; return原创 2013-04-09 20:10:38 · 1314 阅读 · 0 评论 -
交换
#include using namespace std;template void swap(T a[],int first,int second){ T temp; temp = a[first]; a[first] = a[second]; a[second] = temp;}template void reverse(T a[],int begin,int end){原创 2013-04-11 09:15:46 · 871 阅读 · 0 评论