
C++
zhujiahui622
这个作者很懒,什么都没留下…
展开
-
图的所有节点对之间的最短路径—Floyd算法(C++)
Dijkstra算法之后是Floyd算法 Dijkstra算法是求单源最短路径(即固定起点,不固定终点) Floyd算法是求任意点对之间的最短路径(起点和终点都任意)Floyd算法也叫Floyd-Warshall算法 时间复杂度O(n^3),n为图中节点的数目#include <iostream>#include <vector>using namespace std;typedef int原创 2016-08-08 18:52:04 · 4594 阅读 · 1 评论 -
图的深度优先搜索遍历(邻接表&邻接矩阵,递归&非递归)(C++)
图的深度优先搜索遍历可有递归和迭代两种方法。递归的方式比较容易,每次以当前节点的未被访问的邻接节点为新的出发点去遍历即可,编程的时候注意维护好全局的访问标记以及访问序列即可(可以以引用的方式传递)。非递归(迭代)的方式需要借助栈。从起点开始,先保存栈顶,然后栈顶出栈,并将该节点(初始的时候为起点)的所有未被访问的邻接节点依次入栈;重复直到栈为空。C++代码如下: 这里有4个函数,分别是: 邻接表原创 2016-08-09 14:26:52 · 5446 阅读 · 0 评论 -
图的广度优先搜索遍历(邻接表&邻接矩阵)(C++)
图的广度优先搜索遍历这里只列了迭代的算法,递归比较困难搜索遍历需要借助一个队列。 每次将当前节点出队列,以及让该节点的所有未被访问的邻接节点入队列,重复直至队列为空。 节点的出队列的顺序构成了广度优先搜索的遍历序列。采用邻接表时,复杂度为O(V+E)。采用邻接矩阵时,复杂度为O(V^2)。V为顶点数、E为边数。 两者的空间复杂度相同。C++代码如下: 这里有2个函数,分别是: 邻接表 BF原创 2016-08-09 15:24:27 · 5200 阅读 · 0 评论 -
图的最小生成树Prim算法朴素版(C++)
Prim算法从一个节点开始不断选择权值最小的边加入当前已有的树结构,最终遍历完所有的节点得到最小生成树。时间复杂度为O(V^2)。V为图中顶点个数。C++代码如下:#include <iostream>#include <vector>using namespace std;typedef int DATA_TYPE; // 权值为int型const DATA_TYPE NO_EDGE = 1原创 2016-08-10 15:01:13 · 2229 阅读 · 0 评论 -
图的最小生成树Kruskal算法朴素版(C++)
Kruskal算法先将所有的边按权值由小到大排序,然后从无开始(即每个顶点都是一棵子树),每次选取权值最小又不会构成回路的边作为最终最小生成树的一部分。最终能够将多个不连通的子树联合起来构成最小生成树。时间复杂度为O(ElogE+V2)O(E\log E + {V^2})。E为图中的边数,V为图中顶点数。C++代码如下:#include <iostream>#include <vector>#i原创 2016-08-10 16:44:39 · 872 阅读 · 0 评论 -
不相交集(并查集)(C++)
并查集可支持查找元素所属的集合以及不同集合元素的合并。并查集有3个过程: 构建集合 查找指定元素的所属集合(用该集合的代表元素表示,如果是树,就是树根) 不同集合的合并C++代码如下:1. DisjointSet.h//// Created by ZhuJiahui on 2016/8/10.//#ifndef DISJOINTSET_DISJOINTSET_H#define DISJO原创 2016-08-10 20:15:23 · 928 阅读 · 1 评论