
图论
ACM图论
明月千里赴迢遥
这个作者很懒,什么都没留下…
展开
-
HDU 3790 最短路径最小花费
迪杰斯特拉总结相比于普通迪杰斯特拉,我们要做的变动是:优先队列排序 friend bool operator < (const node &f1, const node &f2) { if(f1.w!=f2.w) return f1.w > f2.w; else return f1.p>f2.p; }迪杰斯特拉节点更新if (dis[end] > dis[start] + edge[i].w) { dis[end] =原创 2021-09-09 13:22:49 · 217 阅读 · 0 评论 -
哈密顿图 Dirac 竞赛图
理论https://blog.youkuaiyun.com/qq_41848675/article/details/99686010目录Dirac竞赛图Dirac时间复杂度O(N^2)分析模板的63~71时间复杂度n^2其他的都是n,遵循加法规则,所以时间复杂度O(N^2)下面是我做的一些配图S和T不相邻时相当于T和Vi+1部分颠倒找到新点j时(T代表终点,而不是哈密顿数组里的t) 方向是哈密顿数组下标增大的方向 j是新的终点,也是新的t,可以用来拓展新点上图也可原创 2021-08-16 00:41:07 · 298 阅读 · 0 评论 -
网络流模板 注释详细
该写的都在注释里了,详阅放俩B站视频【算法讲堂】【电子科技大学】【ACM】网络流入门网络流算法—Min Cost Flow 最小费用流问题详解网络流重点在建模,在构图,算法只是模板,要刷题,就像dp模板注释比较详细了,不懂的看视频,Dinic代码第四行还有一篇解析的链接求解最大流 Dinic#include <iostream>//dinic#include <cstdio>//时间复杂度上界是M*N^2 但实际上Dinic算法比这个理论上界好得多。有原创 2021-08-15 04:11:20 · 206 阅读 · 0 评论 -
二分图问题——匈牙利算法+链式前向星 二分图性质 KM算法
匈牙利算法+链式前向星这算法是用来求二分图的最大匹配数,二分图就是可以把点集分成两部分,点集内部互不相连的图。原理网上有很多,比如https://zhuanlan.zhihu.com/p/96229700之类的形象化讲述,严谨的讲数学可以参考https://www.bilibili.com/video/BV1LZ4y1T7Nt例题https://acm.hdu.edu.cn/showproblem.php?pid=2063模板#include <iostream>//求的是原创 2021-08-14 04:28:13 · 468 阅读 · 0 评论 -
超级源点与超级汇点
背景:给出题目,在一张图中有多个点起点,一个终点,求所有起点到终点的最短距离。解题方法:1.跑N边单源最短路,但是这样是不行的肯定超时。2.floyd求出所有最短路,枚举每个起点到终点的距离,这个似乎比法1更慢。3.反向建边,反向跑一遍Dijkstra,或者SPFA,这样就能求到终点到起点的距离,在枚举最小的一个即可,时间复杂度为一遍最短路加枚举N。4.建立超级源点,虚拟出一个点作为源点,源点到所有起点的距离都是0,那么这样求超级源点到终点的最短距离就是所有起点到终点的距离的最短一个,时转载 2021-08-14 00:45:25 · 722 阅读 · 0 评论 -
Kurskal算法求最小生成树 POJ 1751
时间复杂度mlogm 先给每条边按边长排序,然后每次都选取最小的边,用并查集判断他们是否联通,若不连通则相连 (否则连接后成环) ,连成n-1条边后退出算法适用于稀疏图,prim适用于稠密图模板#include<cstdio>//kurskal算法 时间复杂度mlogm 先给每条边按边长排序,然后每次都选取最小的边,用并查集判断他们是否联通,若不连通则相连 (否则连接后成环) #include<algorithm>//适用于稀疏图,prim适用于稠密图 using n.原创 2021-08-13 16:43:34 · 107 阅读 · 0 评论 -
Prim算法求最小生成树
求总权值例题思想类似迪杰斯特拉算法,贪心,两边之和大于第三边不过权值可以是负数写题的时候数组一定要开大,开大,开大!#include<cstdio>//优化后外层循环为n,内层循环1为优先队列push的logn,2一共为边数m乘以push的logn ,时间复杂度由n^2降为logn(n+m)#include<iostream>//数组从1开始而不是0 #include<cstring>//最小生成树不能形成回路#include<queue原创 2021-08-13 01:04:32 · 294 阅读 · 0 评论 -
求最短路总结
目录单源有向无环无负权最短路单源无负权最短路单源有负权最短路+判断负环多源有负权最短路+判断负环单源有向无环无负权最短路采用拓扑+贪心求解,按拓扑把入度为0的节点删去,更新与其相连的节点距离源点s的最短距离,因为无负,因此与其直接相连最短的点的一定比绕一个中转点的距离短,三角形两边和大于第三边(注意,更新的是距离那个点最短的点,而不是任意点!!!)时间复杂度N+M,最优秀了//单源有向无环最短路 拓扑 思路:按拓扑把入度为0的节点删去,更新与其相连的节点距离源点s的最原创 2021-08-12 21:38:14 · 98 阅读 · 0 评论 -
Floyd 弗洛伊德算法 多源最短路
原理:动态规划设中转点是ki,那么i->j的最短路是min(dis[i][j],dis[i][ki]+dis[ki][j]),就是他的最短路要么是两个点直接相连,要么是两个点经过一系列的中转点相连,一系列中转点是一个集合,可以是空集,也可以是k1,也可以是k1、k2,他可以是K的任意子集(K={k1,k2,......,kn})由于最小值满足区间加法,因此我们可以用dp优化用途求多源最短路 判断负环求任意两点的最短距离,如果有负环可以判断出来核心bool floyd() ..原创 2021-08-12 21:28:46 · 368 阅读 · 0 评论 -
单源有负权无负环求最短路径 SPFA 链式前向星实现
SPFA两个作用求最短路径 判断是否存在负环原理:从起点开始加入队列,队首更新与其相邻的点,如果可以松弛就松弛,松弛之后如果这个点不在队列中,加入队列 如果一个点入队次数超过n,存在负环求最短路模板如下#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=1e5+10,M=5e5+10,I原创 2021-08-12 18:35:51 · 124 阅读 · 0 评论 -
迪杰斯特拉算法 Dijkstra 总结
原理概论边权无负数时,从未访问的所有点中选一个距源点最短的点,用它来更新别的点,循环操作。相当于三角形两边和大于第三边,边长都是正数时,你从别的点绕到这个最短的点肯定比直接到最短的点距离要大,所以我们可以放心地用这个最短的点更新别的点,这是贪心的思想故事引入邻接矩阵版 O(N^2版代码)模板#include<cstdio>//有向边无负权有环也行时间复杂度N^2 数组从0开始而不是1 #include<c......原创 2021-08-12 02:42:59 · 582 阅读 · 0 评论 -
HDU 1285 拓扑排序+优先队列
2021年的HDU编译器不支持优先队列用greater,写完放哪都没问题放在HDU编译失败可把我气坏了……后来发现用cmp也是可以的struct cmp { bool operator () (int &a, int &b) { return a > b; }};priority_queue<int, vector<int>,cmp > q;great原理移步拓扑排序#include<cstdio>#includ原创 2021-08-11 22:10:29 · 199 阅读 · 0 评论 -
拓扑排序总结
讲解这大哥讲得好上述链接的模板有两处错误int ans[x++]=u; ///记录答案 这个把int去掉if(cnt!=n) cout<<"有环"<<endl; 不是cnt!=n,是x!=n模板 #include<cstdio>#include<iostream>#include<cstring>#include<queue>#def...原创 2021-08-11 18:09:50 · 94 阅读 · 0 评论 -
图论:链式前向星 邻接表 邻接矩阵 实现+搜索
目录有向图链式前向星(常用 重点)邻接矩阵无向图邻接表有向图链式前向星(常用 重点)链式前向星他讲的很不错这个是倒序存储的,我们一般是倒序输出的,比如这篇https://mp.youkuaiyun.com/mp_blog/creation/editor/119586896代码+模拟版/*链式前向星:静态链表实现。添加节点:为了保证O(1)的添加操作,每条边都加在头结点的后面,这就导致本来在头结点后面的节点的前驱结点变为新添加的节点而新添加的节点为头结点,也就是说正原创 2021-08-11 18:02:03 · 166 阅读 · 0 评论 -
POJ 2230 通过模拟深入了解深搜有向边+链式前向星
题目分类:有向图的欧拉路(利用深度优先搜索+链式前向星)题目大意:一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点。定理:如果一个有向图所有顶点的入度等于出度,则该有向图存在欧拉回路。解题思路:此题实质是建立了一个双向连接的有向图。关键在于理解深搜时从S出发,为什么一定会回到S。可以从反证法角度考虑。假设遍历的顺序为S->A1->A2->A3->...->S->...->An,S在深搜过程中被遍历,则S的入度为1,出度为2,入度与出度不相原创 2021-08-11 03:35:28 · 356 阅读 · 0 评论 -
欧拉回路总结(待更新)
定义欧拉回路:从起点S出发的路径,每条边只走一次,最终回到起点S。(闭环一笔画)欧拉路径:从起点S出发的路径,每条边只走一次,不必回到起点S。(开环一笔画)欧拉图:存在欧拉回路的图半欧拉图:存在欧拉路径的图判断欧拉回路无向图欧拉回路首先判断是否属于一个线段——每个节点在并查集中的根节点相同然后判断是否一笔画回路且可以回到起点——每个节点的度度为偶数实现:开个数组计算度,开个数组实现并查集 核心代码如下,全部代码看例题解析 int root[N...原创 2021-08-10 21:52:29 · 330 阅读 · 0 评论 -
HDU 1878题解 判断无向图欧拉回路
https://acm.hdu.edu.cn/showproblem.php?pid=1878无向图欧拉回路 :首先判断是否属于一个线段:并查集根节点相同然后判断是否一笔画回路且可以回到起点:度为偶数 实现:开个数组计算度概念解析详见欧拉回路总结博客#include<cstdio>#include<cstring>const int N=1e3+5;int root[N];//并查集 int du[N];//度int n,m;//n个节点m条边in..原创 2021-08-10 20:59:09 · 154 阅读 · 0 评论