------图论
文章平均质量分 77
_zhj
加油!
展开
-
HDU5521最短路径
MeetingTime Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Problem DescriptionBessie and her friend Elsie decide to have a meeting. However, after Farme原创 2017-05-09 12:21:41 · 313 阅读 · 0 评论 -
最短路径——SPFA
SPFA可以解决权值有负值的图的单源最短路径,但不能存在从源点可达的权为负的回路,能够检测负圈。判断负环:如果某个顶点入队次数超过V次,则说明有负环。算法期望的时间复杂度为O(k*V),k为所有定点进队的平均次数(在稀疏图中k一般小于2,SPFA算法稳定性较差,在稠密图中SPFA算法时间复杂度会退化)。SPFA算法是对Bellman-Ford算法的一个优化,使用队列减少不必要的计算。实原创 2017-06-14 08:48:35 · 336 阅读 · 0 评论 -
最短路径——Dijkstra
迪杰斯特拉法最短路径:其适用于权值为非负的图的单源最短路径, 建图可用邻接表,也可用邻接矩阵 。非负的原因:归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记为a)以负边相连的点(记为b)确定其最短路径时,它的最短路径长度加上这条负边的权值,结果小于a原先确定的最短路径长度,而此时a在Dijkstra算法下是无法更新的,由此便可能得不到正确...原创 2017-05-09 14:04:28 · 496 阅读 · 0 评论 -
HDU3790 最短路径问题
最短路径问题Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 26688 Accepted Submission(s): 7921Problem Description给你n个点,m条无向边,每条边都有长原创 2017-06-15 09:32:22 · 248 阅读 · 0 评论 -
二分图匹配
这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为转载 2017-07-16 09:15:01 · 259 阅读 · 0 评论 -
dijkstra求次短路径
之前用Dijkstra算法求过最短路径,求次短路径在之前的方法上做一下修改就可以。求从s到t的次短路径有两种情况:1、起点s到某个顶点u的最短路+d(u,t)。2、起点到某个顶点u的次短路+d(u,t)。所以更新路径的时候需要把最短路径和次短路径两个都记录下来。具体见代码:#define N 100000+10 #define INF 100000000 typedef p原创 2017-07-20 12:30:07 · 4318 阅读 · 0 评论 -
二分图匹配练习题
关于二分图匹配的讲解见文章二分图匹配。本文练习两个简单的二分图匹配,分别对应于文章中的dfs和bfs的Hungary算法。1、HDU1150 题意:两台机器A和B,每台都有许多工作模式。有多个任务,每个任务可以在A机器的某个模式或者在B机器的某个模式完成。问最少需要重启几次机器。分析:该问题即最小点覆盖,即选取最少的点,使任意一条边至少有一个端点被选择,任务相当于边。最小点覆盖数=原创 2017-07-17 09:19:08 · 1025 阅读 · 0 评论 -
链式前向星
之前存图用邻接表都是直接使用的vector,但是vector是自动扩容的,在空间不够的时候会自动申请多一倍的空间,这样的话空间浪费比较严重,而且有的题目会卡空间,可能就过不了。如果使用链式前向星,就可以节省不少空间,开一个和边的数目相同的数组就可以了。链式前向星包括两个部分:head数组,和edge数组。head[i]表示以i为起点的第一条边的位置。edge是个结构体数组:stru原创 2017-07-18 09:36:50 · 302 阅读 · 0 评论 -
最小生成树——Prim
prim算法是求最小生成树的算法,与求最短路径的dijstra算法类似。是以点为基础进行扩展的。算法的执行过程为:划分两个集合,一个是已放置好的点,另一个数未放置好的点。从任意一个点开始,将这个点放入第一个集合,然后找到与第二个集合中与第一个集合中点距离最近的点,加入第一个集合,重复此操作,一直到所有点都加入为止。时间复杂度:未优化之前的复杂度是O(v^2),使用优先级队列优化后可以达到O(E原创 2017-07-01 11:18:53 · 325 阅读 · 0 评论 -
最短路径——Bellman-Ford
Bellman-Ford算法可以解决权值有负值的图的单源最短路径,但不能存在从源点可达的权为负的回路,能够检测负圈。可以是有向图,也可以是无向图,但无向图中不能有负边(因为无向图有负边的话,这两个点之间就有负环路了)。Bellman-Ford算法的时间复杂度是O(V*E)。(V是定点数,E是边数)Bellman-Ford算法的流程如下:给定图G(V, E)(其中V、原创 2017-06-13 17:07:15 · 258 阅读 · 0 评论 -
最短路径——Floyd
Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。适用于多元最短路, 效率较低, 建图只能用邻接矩阵,可以有负边,但不能有负环。Floyd算法是基于动态规划的,依次扫描每个点,并以此点为中介,计算出经过该点的路径(i, j)的最短路径。弗洛伊德(Floyd)算法过程:1、用D[v][w]记录每一对顶点的最短距离。2、依次扫描每一个点,并以其为原创 2017-06-12 16:10:02 · 376 阅读 · 0 评论 -
并查集
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。#define N 1050int Father[N];int Getfather(int num){// return Father[num] == num ? num : Getfather(Father[原创 2017-05-18 10:22:08 · 224 阅读 · 0 评论 -
HDU4858 项目管理
项目管理Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Description我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点。每个节点都有原创 2017-05-18 19:51:53 · 272 阅读 · 0 评论 -
有向无环图的最短路径
问题:给定一个有向无环图和一个起点,求这个点到其他点的最短路径。(参考算法导论)因为求最短路径,所以之前的那些方法都可以用,但是这是个有向无环图,可以使用更好的方法在O(V+E)的时间内求出解。在这个图中,可以存在权值为负的边,因为无环也就没有负环,所以存在负边也可以求解。方法:1、先对有向无环图进行拓扑排序,确定结点之间的一个线性次序。2、按照拓扑排序的次序对点进行一遍处理即可。原创 2017-06-17 10:17:48 · 1411 阅读 · 0 评论 -
HDU1596 find the safest road
find the safest roadTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12829 Accepted Submission(s): 4566Problem DescriptionXX星原创 2017-06-18 09:02:56 · 196 阅读 · 0 评论 -
johnson最短路径
Johnson算法是求稀疏图的多元最短路径的算法,权值可以为负,但是不可以有负环。Johson算法是Bellman-Ford算法, Reweighting(重赋权重)和Dijkstra算法的大综合。主要的思想是使用dijstra算法对每个结点求单源最短路,但是dijstra不能解决有负权值的边,所有需要给边重新赋值,且赋值后最短路径与原来的最短路径的距离和path相同。使用斐波那契堆作为优先级队列转载 2017-06-30 17:14:04 · 1259 阅读 · 0 评论 -
最小生成树——kruskal
Kruskal算法是基于贪心的算法,以边为基础进行扩展。首先我们把所有的边按照权值先从小到大排列,接着按照顺序选取每条边,如果这条边的两个端点不属于同一集合,那么就将它们合并,直到所有的点都属于同一个集合为止。合并的过程需要用到并查集(具体见并查集)。Kruskal的时间复杂度分析:Kruskal算法每次要从都要从剩余的边中选取一个最小的边。通常我们要先对边按权值从小到大排序,这一步的时间原创 2017-07-01 10:13:50 · 282 阅读 · 0 评论 -
HDU2682 Tree
TreeTime Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2676 Accepted Submission(s): 830Problem DescriptionThere are N (2<=N<=600原创 2017-07-01 18:03:47 · 245 阅读 · 0 评论 -
次优最小生成树
次优最小生成树是由最小生成树而来的,含义就是所有的生成树集合中,除去最小的那棵,剩下的集合中最小的生成树。(如果所有边的权值都不同,那么次优生成树是一定大于最小生成树的,但是如果存在边的权值相同,则次优生成树可能会等于最小生成树)基本思路是:先求出最小生成树T,然后将不属于最小生成树中的边加入T中,此时会形成一个环,然后将环中最大的一条边(刚加入的边不算)去掉,这样可以保证增加量是最小的。依次原创 2017-07-02 12:19:15 · 1317 阅读 · 0 评论 -
TSP问题(动态规划求解)HDU5067
问题描述:有n个城市,从第一个城市出发,每个城市只能走一次,再回到第一个城市,求最小代价。思路:使用动态规划,dp[i][j],其中i是压缩的状态,表示第i个城市是否已经走过,j表示第j个城市。dp[i][j]表示状态是i且当前所在的城市是j时最小代价。转移方程:dp[i|(1<<k)][k] = min(dp[i|(1<<k)][k], dp[i][j]+di...原创 2019-04-16 10:28:07 · 803 阅读 · 0 评论