![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
WellerZhao
熟练掌握C/C++、objective-c、java开发语言,专注于移动开发。
展开
-
拓扑排序优化
之前就写过一篇关于拓扑排序的http://blog.csdn.net/monkey0le/article/details/7889725今天参加某网络赛,其中有一题就是拓扑排序的,一看觉得开心,模板直接一放上去,TLE了,不开心。后来才发现那种做法的复杂度是O(n^2)的,而且花费的空间也很大,于是做优化:用临界表来保存每条边,拓扑排序的时候,把入度为0的点放入队列里面,同时,每次进行原创 2013-03-30 15:33:47 · 1899 阅读 · 0 评论 -
解题报告-HDOJ-1233(最小生成树——kruskal)
之前我写过一个最小生成树的prim算法,当时我说过还有另一种求最小生成树的算法,那就是今天要说的——克鲁斯卡尔,如果想学习普林姆的可以翻看我前面写的博客文章http://blog.csdn.net/monkey0le/article/details/7725547。前面说过,prim算法的思想是把点加入到另一个集合中,而kruskal恰好相反,它的思想很简单,不断找最小的边加入进去,并且保证加原创 2012-09-16 20:14:29 · 820 阅读 · 0 评论 -
解题报告-HDOJ-1874(单源最短路径——Dijkstra)
Dijkstra算法:使用Dijkstra算法有前提条件,所有的边为正。讲这个算法之前首先要先定义一个无穷大的量,用INF表示,而无穷大究竟是多大呢?我们知道在实际编程中,并不存在无穷大这个定义,每种数据类型都有其表示范围,而我们这里定义的无穷大,实际上是很大的整数,这个整数并不会影响到题目的其他数据。例如,题目中给定的数据为最大不超过100,而100000这个数相对于100已经很大了那么原创 2012-08-20 13:28:36 · 890 阅读 · 0 评论 -
解题报告-HDOJ-2063(最大二分匹配-匈牙利算法)
匈牙利算法:找一条已经被匹配上的边和未被匹配上的边相互交替的路径,这条路径长度为奇数并且未被匹配上的边比被匹配上的边多1。通过把增广路上未被匹配上的边改为匹配上的边,而匹配上的边全部改为未被匹配上的边,就可以把匹配数加1。重复此操作直到再也找不到这样的路径。例如:第一步:我们从点a找到了与a有路径的点d,由于点d没有匹配到,所以直接添加a、d边。第二步:搜索点b,通过b点找到d原创 2012-07-17 21:49:27 · 1279 阅读 · 0 评论 -
解题报告-HDOJ-1385(最短路径——Floyd)
我前面写过单源点的最短路径dijkstra和SPFA算法,但是如果要求多对点之间的最短路径,那我们就需要循环n次调用dijkstra算法,其算法复杂度为O(n^3)。而对于这种多个点之间的最短路径,我们还有另一种算法:Floyd弗洛伊德算法,它的算法复杂度也为O(n^3),但是它的代码量比dijkstra简单了不少。算法过程:1、从任意一条单边路径开始,所有两点之间的距离是边的权,或者是无原创 2012-09-16 22:05:08 · 692 阅读 · 0 评论 -
解题报告-HDOJ-1874(单源最短路径——SPFA)
前面说过dijkstra不能对负权边进行操作,而现在介绍的SPFA算法是对dijkstra的一种改进,它可以对负权边进行处理,而且还可以判断是否存在负环。如果存在一个点进入队列的次数超过N次,则存在负环。下面SPFA的代码可以代替dijkstra的代码:int SPFA(int star, int end, int n){ dis[star] = 0; Q.push(原创 2012-09-16 21:42:07 · 938 阅读 · 0 评论 -
解题报告-HDOJ-1285(拓扑排序)
拓扑排序算法思想: (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.注:拓扑排序得到的拓扑序列不唯一。例如:将下图进行一次拓扑排序,输出其中的一个拓扑序列。第一步:搜索图中入度为0的点,我们可以找到a、e,我们选择a,删去该点,同时原创 2012-08-21 11:05:24 · 960 阅读 · 0 评论 -
解题报告-HDOJ-1162(最小生成树——Prim)
题意:Eddy画了画像,由几个点组成,求解出能把所有点连接在一起所需要的最短线的和。这一题所涉及的内容是最小生成树,求解最小生成树的方法可以使用普林姆和克鲁斯卡尔两种方法,这里介绍一下普林姆算法的思想。假设有如下图1:点集a1 = {a,b,c,d,e},a2为空集,普林姆算法需要空集a2加入点集a1中的点,同时集合a1去掉该点,直至a1为空集。假设我们从点a开原创 2012-07-08 00:03:47 · 5388 阅读 · 0 评论 -
解题报告-HDOJ-1242(广度优先搜索)
题意:在一个N*M的地图中拯救出一个被困在迷宫中的天使,地图中的“.”表示道路,“a”表示被困的天使,“r”表示天使的朋友,“x”表示守卫,“#”表示围墙(“x”和“#”貌似在题目中没有描述出来,以至于笔者纠结了很长时间)。假设拯救出天使相当于天使的朋友跑到天使所在的位置,每移动一格,需要消耗一个单位的时间,如果道路上有士兵则需要先把士兵消灭,消灭士兵需要一个单位的时间。输出找到天使所需要原创 2012-07-03 22:48:22 · 904 阅读 · 0 评论