
图论
chp的博客
这个作者很懒,什么都没留下…
展开
-
AcWing 851. spfa求最短路&&AcWing 852. spfa判断负环—spfa算法
spfa算法是对bellman-ford算法的改进,bellman-ford算法比较笨,要遍历所有边来更新,其实如果当前点没有被更新的话,就不用用当前点来更新他所连接的点了。我们只需要每次更新一个点后,继续更新该点连接的点即可。正如bellman-ford算法中提到的,一个点到其余点的最短路径,最长需要经过n-1条边,所以如果有大于等于n条边,则说明一定有环。注意从单元点出发,有可能找不到环,因为环不一定在最短路径上。原创 2024-01-06 15:29:01 · 591 阅读 · 0 评论 -
AcWing 853. 有边数限制的最短路—bellman-ford算法
优秀的地方,但是要注意的是能解决带负权边的最短路问题,如果负权边构成了负权回路,那就有可能求不出来了。需要注意的是,我们可以把n轮更新,理解为,1号点经过不超过n条边到达其余点的最短距离。bellman-ford算法可以用来解决带负权边的最短路问题,这是相比于。另外我们可以发现,在无环的情况下,1号点到其余点最长需要经过n-1条边。bellman-ford算法的主要思想是做松弛操作,类似于。如果需要要求边数为k,则遍历k轮即可。轮松弛操作,每次遍历。原创 2024-01-06 14:29:31 · 428 阅读 · 0 评论 -
AcWing 861. 二分图的最大匹配—匈牙利算法
接着为2寻找匹配,2可以匹配a,c,首先与a进行匹配,发现a已经被1号匹配了,那么就看看能否再为1号找到一个新的匹配,发现可以为1号找到新的匹配c。1号还能与a匹配,但是a被2号匹配了,于是寻找2号能否匹配(从b中选),发现可以为2号寻找到新的匹配,于是为3号找到了匹配。接着为3寻找匹配,3号可以与c匹配,但是c被1号匹配了,于是寻找能否为1号寻找其他的匹配(从a,b中选)首先为1寻找匹配,1可以匹配a,c,1首先和a匹配。接着为4寻找匹配,发现无法为4寻找到新的匹配了。所以该图的最大匹配数为3。原创 2024-01-05 12:33:48 · 483 阅读 · 0 评论 -
最小生成树Kruskal算法
目录算法简介算法分析算法步骤模板题分析代码算法简介克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止算法分析Kruskal算法的时间复杂度为mlogmm log mmlogm,适合原创 2020-10-23 17:13:01 · 1533 阅读 · 0 评论 -
朴素Prim算法
普里姆算法(Prim算法),是一种求最小生成树的方法#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=510;const int INF=0x3f3f3f3f;int g[N][N];int d[N];bool f[N];int n,m;int prim(){ memset(d,0x3f,sizeof d); int原创 2020-10-23 11:17:25 · 389 阅读 · 1 评论 -
最短路SPFA
SPFA算法是对Bellman-ford算法的优化,优化的思想:Bellman-ford算法是遍历所有边,对边进行松弛操作,但是如果前一个边的距离没有变化,那么后一个边的距离也不会变化。通过这个特性,我们可以将变化距离的点存在队列中,只对这些点的后继点进行松弛操作。SPFA算法的时间复杂度为O(m)-O(nm),m为边数,n为点数,最坏情况与Bellman-ford算法相同。acw...原创 2020-10-22 16:48:00 · 229 阅读 · 0 评论 -
acwing853. 有边数限制的最短路(Bellman-Ford)
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible。注意:图中可能 存在负权回路 。输入格式第一行包含三个整数n,m,k。接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示从1号点到n号点的...原创 2020-10-21 15:50:00 · 225 阅读 · 0 评论 -
Dijkstra求最短路(朴素做法与堆优化)
Dijkstra求最短路的基本思路是贪心算法,求解单源最短路。适用于求解正权边。算法的基本原理可以自行查看。这里讲解两种求最短路的方法:(1)、朴素算法朴素算法的时间复杂度为O(n2),适用于稠密图,用邻接表来存图,并且可以处理自环和重边。Dijkstra求最短路 I给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,...原创 2020-09-15 19:20:00 · 275 阅读 · 0 评论 -
树的重心
树的重心定义:树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。通俗点讲,就是在树中去掉一个点,删除这个点后,最大连通块(一定是树)的结点数最小。数的重心一些特性:树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个重心,他们的距离和一样。把两棵树通过一条边相连,新的树的重心...原创 2020-09-06 17:39:00 · 208 阅读 · 0 评论 -
Tarjan模板
#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#include<vector>using namespace std;const int N=1e4+10;vector<int>v[N];stack<int>t;int dfn[N],low[N];int time=1;//记录访问时间 int flag[N];//.原创 2020-05-19 22:51:37 · 488 阅读 · 0 评论 -
hdu2544-Dijkstra算法(堆优化)
hdu2544最短路题意很容易理解,是经典的 Dijkstra算法,今天用堆优化的方法写了一遍,这里有我之前写的用数组存图的普通Dijkstra算法。堆优化用vector存图,能够解决二维数组不能开的太大的问题,pii first存的是距离,second存的是id。优先队列能够更快找到最短路路径。ac代码如下(写的有些复杂):#include<cstdio>...原创 2019-11-26 16:17:00 · 731 阅读 · 3 评论