图
文章平均质量分 78
娃哈哈纯净李
这个作者很懒,什么都没留下…
展开
-
图的邻接矩阵表示
图的表示有两种,一种是邻接矩阵,还有一种是邻接表,下面先讨论邻接矩阵,包括顶点和边的插入和删除,深度优先遍历和广度优先遍历。 其实可以不用Vertex和Edge两个结构体,而直接用vector V和vector >E,来表示边,最多为了遍历,加上一个vector visited的向量。就可以完全完成存储,插入,删除和遍历的基本操作了! GraphMatrix.h的内容如下: //GraphM原创 2014-12-19 22:23:44 · 654 阅读 · 0 评论 -
图的邻接表表示
图的邻接表表示可以减少存储空间,但是同时增加了访问时间。下面是邻接矩阵和邻接表的适用情况: 邻接矩阵: 1)经常检测边的存在; 2)经常做边的插入/删除操作; 3)图规模相对固定 4)稠密图 邻接表: 1)经常计算顶点度数; 2)顶点数目不确定; 3)经常做遍历; 4)稀疏图; 对于邻接表的存储,我没有想到什么比较好的办法,就是用vector> V来做的存储,由于存储的不是地原创 2014-12-22 21:57:01 · 731 阅读 · 0 评论 -
图的拓扑排序
拓扑排序的方法有两种(是我知道的有两种):一种是利用深度优先搜索,把节点状态分成未发现(WHITE),发现(GRAY)和其相邻节点被访问完(BLACK)。根据BLACK时间按从大到小的顺序排序,即可以得到拓扑排序。第二种方法是把所有节点的入度做一个小顶堆,然后不断删除一条边,如果度为0了,则出堆,最后能够构成拓扑排序的结果。 代码如下: //GraphMatrix.h #ifndef __Gr原创 2014-12-24 20:26:33 · 480 阅读 · 0 评论 -
图的强连通分量
图的强连通分量:即子图中的所有顶点都能够到当前子图中的任意其它顶点。 程序是参考的《算法导论》中图那一张的强连通分量一节。算法思想:先用DFS遍历一遍图,标记其discover时间和finish时间,然后用当前的图创建其转置图,即顶点相同,边的方向相反。然后按照转置图的finish时间从大到小一次遍历,得到的一个森林就是需要的强连通图。 代码: //GraphMatrix.h #ifndef原创 2014-12-25 11:37:31 · 554 阅读 · 0 评论 -
图的最小生成树算法
图的最小生成树有两种算法: 一种是Kruscal算法:把图的每个节点看成是不同的集合,把所有的边都放入到优先级队列中去,不断从优先级队列中取出边,如果这个边的两端点属于不同的集合,那么就把这条边加入到最小生成树的边,并且把这两个集合合并,如果这两个边的端点属于同一集合,则相当于是环状,就丢弃当前这条边。 用到的主要的数据结构就是优先级队列和一个简单的并查集,优先级队列是用的STL标准库,是用v原创 2014-12-25 23:13:48 · 820 阅读 · 0 评论 -
单源最短路径算法
参考资料:《算法导论》第24章:单源最短路径,《数据结构(C++语言版)》(邓俊辉)第六章:图 单源最短路径算法,有两种比较经典的算法: 一种是Dijkstra算法,此算法应用有限制,即只能用在图边的权重为正值的情况下,因为如果边权重为负值,则更新一个点的距离有可能需要进行两次访问,而Dijkstra算法对于图中的每个点都只进行了一次访问。时间复杂度为O((V+E)logV),这是在用优先级队原创 2014-12-29 20:25:46 · 775 阅读 · 1 评论