图论
文章平均质量分 64
LeeHolmes
这个作者很懒,什么都没留下…
展开
-
关于图论的基础概念
最近遇到了不少关于图论的题目,虽然零零散散看了一些理论,但完全记不住,所以把它们写下来,也算是帮助自己记忆。 图(graph)是由非空有限集合V和集合E组成,记为G=(V,E);其中V中的元素称为顶点(vertices),E中的元素称为边(edges);这是相当直观的,易于理解;但是需要注意的是图论的术语在使用上不统一,定义有时也是略有区别的; 边连接两个顶点,两个原创 2016-02-20 22:13:26 · 2529 阅读 · 0 评论 -
最小生成树 Kruskal算法
最小生成树,是最小权重生成树的简称;那么什么是最小权重生成树呢? 这个问题可以分解为三个问题,什么是树?什么是生成树?什么事最小权重生成树? 树是指无向图中连通又不含圈的图; 生成树是指对于给定的一张无向图,有那么一棵树连接无向图的所有点,并且这棵树的边集是无向图边集的子集,那么这棵树就是无向图的生成树,其中权值最小的就是最小权重生成树;原创 2016-03-06 23:28:51 · 605 阅读 · 0 评论 -
最小生成树 Prim
这是求解最小生成树的两种主要方法之一;关于最小生成树,在我的《最小生成树 Kruskal》这篇文章中有简单的介绍; Prim算法,和Kruskal算法都是基于一种贪心的思路; 首先,选择任意一个结点,在与这个结点关联的边中,选择权值最小的一条,把这条边的另一个端点记录下来; 从已经记录的端点中,找出以它为顶点的边中权值最小的; 不断重复这个操作,即可;原创 2016-03-07 22:59:12 · 342 阅读 · 0 评论 -
最短路问题 Bellman-Ford算法
Bellman-Ford算法是用来求解含有负权的单源最短路径的,但当负权存在的时候,最短路就不一定存在,所以这个算法还能判断负环的存在;思路、代码都比较简单;求得的最短路一定不含环,所以经过的结点是n-1个(除去了起点);进行n-1次操作,每次检查每一条边,进行松弛操作;再对每条边进行检查,如果还能松弛,那么就一定存在负环,最短路就不存在;否则就存在;讲真的,最短路算法感觉原创 2016-03-09 16:56:11 · 1357 阅读 · 0 评论 -
图论之邻接表的数组实现
虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷;当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来;这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了——邻接表,当然使用vector数组也是一种良好的选择;邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法;首先,有三个数组,分别为u[原创 2016-05-11 00:13:52 · 2478 阅读 · 0 评论 -
spfa算法(FIFO优化的BellmanFord算法)
spfa算法用FIFO队列代替BellmanFord算法的循环检查,所以在效率上是相当不错的;struct Edge{ int from;//出发结点 int to;//终止结点 int dist;//距离 Edge(int u,int v,int d):from(u),to(v),dist(d){}};//一些重要的参数和初始化int n;/原创 2016-05-24 23:49:14 · 816 阅读 · 0 评论 -
最短路之Floyd算法
Floyd-Warshall算法用途:计算图中每两点之间的最短距离;初始化:d[i][i]=0;其余为INF;代码:for(int k=0;k<n;++k) for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(d[i][j]<INF&&d[k][j]<INF) d[i][j]=min(d[i][j],d[i][k原创 2016-05-01 01:04:40 · 398 阅读 · 0 评论 -
priority queue 优化的 dijkstra 算法
dijkstra 算法是非常常用的最短路算法,所以它的效率至关重要;这里采用vector进行图的存储,概念比较简单易懂,同时效率也还可观;struct Edge{ int from;//出发结点 int to;//终止结点 int dist;//距离 Edge(int u,int v,int d):from(u),to(v),d原创 2016-05-15 23:28:18 · 909 阅读 · 0 评论 -
最短路之Dijkstra
Dijkstra算法适用于边权为正的情况,可用于计算正权图上的单源最短路径;其算法的思想在于,从单个源点出发,找到距离其最近的结点,然后松弛路径,反复重复上述操作,就可以得到固定源点到图上任意一个顶点的最短路径;这个算法的代码和prim算法的代码很像;void dijkstra(){ bool vis[105];//标记数组,记录结点是否被访问过; int d原创 2016-05-05 23:27:03 · 377 阅读 · 0 评论