随笔分类 -  before 2025.8 / 图论

摘要:二分图及相关概念 二分图:又称二部图,是一种特殊的图结构,其顶点集可以被划分为两个互不相交的子集和,并且图中所有的边都连接着中的顶点和中的顶点,和内部没有边。 匹配:在二分图中,匹配是指一组边的集合,其中任意两条边都没有公共顶点。 最大匹配:是指在所有可能的匹配中,边数最多的匹配。 实现步骤 初始化 阅读全文
posted @ 2025-02-27 20:18 流氓兔LMT 阅读(41) 评论(0) 推荐(0)
摘要:Tarian 一遍,标记割边。记录 eDCC(边双联通分量)将 eDCC 缩点。 得到一棵树,树边就是原图的割边。 观察发现.最少需要加(sum+1)/2条边.可以使整个图变为边的双连通图。sum 为缩点后叶节点的个数。 板子 int dfn[N], low[N], tim, dcc[N], cnt 阅读全文
posted @ 2025-02-26 19:30 流氓兔LMT 阅读(21) 评论(0) 推荐(0)
摘要:割边:对于一个无向图,如果掉一条边后图中的连通块个数增加了. 则称这条边为桥或者割边。 割边判定法则: 当搜索树上存在 × 的一个子节点 y. 满足 low[y]>dfn[x], 则 (x.y)这条边 就是割边。 板子 #include <bits/stdc++.h> using namespace 阅读全文
posted @ 2025-02-26 18:53 流氓兔LMT 阅读(49) 评论(0) 推荐(0)
摘要:割点判定法则: 如果× 不是根节点。 当搜索树上存在 ×的一个子节点 y。 满足 $low[y]≥dfn[×]$, 那么 × 就是割点。 如果×是根节点。 当搜索树上存在至少两个子节点 满足上述条件。 那么 x就是割点。 板子 #include <bits/stdc++.h> using names 阅读全文
posted @ 2025-02-26 16:29 流氓兔LMT 阅读(15) 评论(0) 推荐(0)
摘要:2-SAT,简单的说就是给出 n 个集合,每个集合有两个元素,已知若干个 <a,b>,,表示 a 与 b 矛盾(其中 a 与 b 属于不同的集合)。然后从每个集合选择一个元素,判断能否一共选 n 个两两不矛盾的元素 把每个变量看成点,把n 个点拆成 2n 个点, 即把 x_i 拆成i 和 i + n 阅读全文
posted @ 2025-02-26 15:54 流氓兔LMT 阅读(37) 评论(0) 推荐(0)
摘要:费用流 给定一个网络G = (V,E), 每条边有容量限制c(u,v), 还有单位 流量的费用w(u,v)。 当(u,v)的流量为f(u,v)时. 需要花费f(u,v) × w(u,v)的费用。 该网络中总花费最小的最大流称为最小费用最大流,总花费最大 的最大流称为最大费用最大流,二者合称费用流模型 阅读全文
posted @ 2025-02-26 11:00 流氓兔LMT 阅读(79) 评论(0) 推荐(0)
摘要:Dinic 算法 一次可以累加多条增广路的流量 表头 head[u]:存u 点的第一条出边 深度 dep[u]:存u 点所在的图层 当前弧 cur[u]:存u 点的当前出边 bfs0对点分层,找增广路 dfs() 多路增广 (1) 搜索顺序优化 (分层限制搜索深度) (2)当前弧优化 (剪枝) (3 阅读全文
posted @ 2025-02-26 09:38 流氓兔LMT 阅读(38) 评论(0) 推荐(0)
摘要:最小割=最大流 bfs()找增广路(最短路思想) 初始化,mf0=0.mf[S]=∞.S入队。 只要队不空,u点出队. 枚举u的所有出边,更新u的最 小容量,记录前驱边,扩展儿子入队。 若能走到T点,返回true。 若不能走到T点,返回false。 EK()求最大流(类似挤牙膏) 循环找增广路,每找 阅读全文
posted @ 2025-02-26 08:18 流氓兔LMT 阅读(36) 评论(0) 推荐(0)
摘要:基本概念 分治思想:点分治的核心思想是分治,它通过选择合适的根节点将树划分为若干子树,递归地处理每个子树,最后合并子树的结果得到整棵树的解。 重心:在点分治中,通常会选择树的重心作为根节点。树的重心是指树中的一个节点,当把这个节点作为根时,其所有子树中最大子树的节点数最少。选择重心作为根可以保证每次 阅读全文
posted @ 2025-02-25 07:38 流氓兔LMT 阅读(60) 评论(0) 推荐(0)
摘要:基本概念 树链剖分:就是把树中的节点划分成若干条不相交的链,然后通过对这些链进行处理来解决树相关的问题。其核心思想是将树中的节点按照一定规则划分成重链和轻链,使得树的结构在某种程度上变得更易于处理,能将一些与树相关的操作的时间复杂度优化到可接受的范围。 重儿子与轻儿子:对于树中的每个节点,其子树大小 阅读全文
posted @ 2025-02-24 19:12 流氓兔LMT 阅读(75) 评论(0) 推荐(0)
摘要:强连通分量 阅读全文
posted @ 2025-01-20 19:36 流氓兔LMT 阅读(33) 评论(0) 推荐(0)
摘要:SPFA 阅读全文
posted @ 2025-01-20 19:15 流氓兔LMT 阅读(25) 评论(0) 推荐(0)
摘要:dijkstra本质上的思想是贪心,它只适用于不含负权边的图. 我们把点分成两类,一类是已经确定最短路径的点,称为"白点",另一类是未确定最短路径的点,称为"蓝点"dijkstra的流程如下 初始化dis[start]=0,其余节点的dis值为无穷大. 找一个dis值最小的蓝点x,把节点x变成白点. 阅读全文
posted @ 2025-01-20 17:51 流氓兔LMT 阅读(24) 评论(0) 推荐(0)
摘要:把图中的所有边按代价从小到大排序; 把图中的n个顶点看成独立的n棵树组成的森林; 按权值从小到大选择边,所选的边连接的两个顶点ui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。 int n,fa[]; i 阅读全文
posted @ 2025-01-20 17:11 流氓兔LMT 阅读(29) 评论(0) 推荐(0)
摘要:并查集主要支持两种操作 find 查询一个元素属于那个集合 Merger 合并 int find(int x) { if(fa[x]==x) return x; return fa[x]=find(fa[x]); //直接连到祖先 } void Merger(int x,int y) { x=fin 阅读全文
posted @ 2025-01-20 16:56 流氓兔LMT 阅读(26) 评论(0) 推荐(0)
摘要:该算法的基本思想是从一个结点开始,不断加点.每次要选择距离最小的一个结点,以及用新的边更新其他结点的距离。 从任意一个结点开始,将结点分成两类:已加入的,未加入的。 每次从未加入的结点中,找一个与已加入的结点之间边权最小值最小的结点 然后将这个结点加入,并连上那条边权最小的边。 更新所有点到最小生成 阅读全文
posted @ 2025-01-20 16:56 流氓兔LMT 阅读(35) 评论(0) 推荐(0)