文章目录
图论
灵魂拷问
- DAG或者UDAG
- 是否有重边或者自环
- 从根节点或者其他节点开始是否一样?
- 是否存在多个连通块
思维
- 反向构造图
- 完全图,只保留有用边
图论问题
连通块问题
DFS:染色法
- 将每一个块染色。
并查集:边带权的并查集
- 边带权:连通块的数量。
- 所有的信息在根节点上。
判断是否有环
DFS:三色判定法。
- **为什么需要三种颜色?**遍历过且无环的节点为2,遍历过但有环路径上的节点为1。
- dfs判定环看是否有重复遍历。
- 但有重复遍历,不一定有环。
拓扑排序:
- 拓扑排序适合于有向无环的图
- 如果无法输出全部结点,说明有环
判定是否存在负环
Bellman算法:更新次数大于n-1
- 额外增加一次循环(表示长度为n)的路径,如果更新则存在负环。
SPFA算法:更新次数大于n-1
- 使用
count记录更新次数。 - 注意:存在多个连通块,因此必须让每个节点都入对列,保证检查每一个连通块的负环情况。
标准最短路问题
- BFS:等权重最短路。在这种情况下,BFS的效率是最高的
- Floyd:多源最短路问题
最短路问题的建模
最小修改次数问题
将字符串A变为字符串B的最短路问题:数独
- 比较适用于双向BFS,状态为当前串。
- 给定可以转移的状态列表,给出从状态A转换为状态B的最短路径,本质是BFS。
- 矩阵相关:注意先将矩阵转换为字符串,然后按照正常的BFS来搜索
跳跃游戏
- 状态为当前位置
- 最优性原理:所有节点不会重复遍历,且遍历过即最优。
网格图问题:2D坐标->1D坐标
- 所给出的图是一个nxm的网格
- 当作一般的图即可,使用邻接矩阵存储。一般下一次添加的节点是相邻节点。
- 网格/坐标图中邻接矩阵的构建 :一般采用im+j / 手动编号(0~nm-1)的方式。
- 不要暴力使用map构造pair<int,int>的映射!!!
坐标图问题:坐标手动编号->[1,n]
利用最短路辅助解决问题
- 2972转换字符串的最小成本:这题字符串长度为1e5,状态数过多,用dj和bfs不可能过。但我们可以使用暴力的方法,求出每一步转换的最小成本,然后利用最短路求出这些所有转换成本,最终解决。
二分图应用
寻找互不冲突的两个组
- DFS二分图染色判定。
寻找一一配对
- 每一个配对都是二分图中的匹配。
- 匈牙利二分图匹配算法。
例题
一、图的遍历
§1.1 深度优先搜索(DFS)
- 寻找有环:三色标记法,原因是为了区分不同的连通块和遍历起点(有向图)。
- DFS适合搜索所有可能的路径,但不适用于最短路问题。
| 分类 | 题号 | 题目 | 备注 |
|---|---|---|---|
| 连通块基础 | 547 | 🟩省份数量 | 🟩重要 |
| 连通块基础 | 1971 | 🟩寻找图中是否存在路径 | 🟩重要 |
| 连通块基础 | 841 | 钥匙和房间 | 🟩重要 |
| 连通块基础 | 1319 | 连通网络的操作次数 | 🟦扩展 |
| 连通块基础 | 2316 | 🟩统计无向图中无法互相到达点对数 | 🟦扩展 |
| 连通块基础 | 2492 | 两个城市间路径的最小分数 | 🟦扩展 |
| 连通块基础 | 2685 | 统计完全连通分量的数量 | 🟦扩展 |
| 路径搜索 | 797 | 🟩所有可能的路径 | 🟩重要 |
| 路径搜索 | LCP 07 | 传递信息 | 🟦扩展 |
| 路径搜索 | 1306 | 跳跃游戏 III | 🟦扩展 |
| DAG / 拓扑相关 | 207 | 🟩课程表 | 🟩重要 |
| DAG / 拓扑相关 | 802 | 找到最终的安全状态 | 🟩重要 |
| DAG / 拓扑相关 | 2192 | 有向无环图中一个节点的所有祖先 | 🟦扩展 |
| 图上扩散 / 传播 | 2101 | 引爆最多的炸弹 | 🟦扩展 |
| 图上扩散 / 传播 | 924 | 尽量减少恶意软件的传播 | 🟦扩展 |
| 并查集可替代 DFS | 721 | 账户合并 | 🟦扩展 |
| 删除 | 3387 | 两天自由外汇交易后的最大货币数 | 难度偏高 / 综合技巧 |
| 删除 | 3695 | 交换元素后的最大交替和 | 难度偏高 |
| 删除 | 928 | 尽量减少恶意软件的传播 II | >2000 |
| 删除 | 2092 | 找出知晓秘密的所有专家 | >2000 |
| 删除 | 3108 | 带权图里旅途的最小代价 | >2000 |
| 删除 | 3310 | 移除可疑的方法 | 题型偏综合 |
| 删除 | 261 | 以图判树 | 会员题 |
| 删除 | 323 | 无向图中连通分量的数目 | 会员题 |
一、BFS 最短路(边权为 1)
边权为1,使用BFS最快。
分类 题号 题目 备注
基础单源 BFS 3243 🟩新增道路查询后的最短距离 I 🟩重要
基础单源 BFS 1311 🟩获取你好友已观看的视频 🟩重要
多源 / 全源 BFS 3015 🟩按距离统计房屋对数目 I 🟩重要
状态图 BFS 1129 🟦颜色交替的最短路径 🟦经典 / 分层状态
建图转换 815 🟦公交路线 🟦经典 / 超时风险低
环检测 & BFS 2608 🟦图中的最短环 🟦扩展
综合模拟 2039 🟦网络空闲的时刻 🟦扩展
会员题(跳过) 3807 修复边以遍历图的最小成本 会员题
以下是对该题单的二次筛选结果,保留最具代表性、适合进一步练习的题目:
一、图论建模 + BFS 最短路
- 最短路=最短距离=最短修改次数,这种说法可以建模为图论的最短路问题:转化数字的最小运算数 ,开锁次数,转化数字的最小运算数
- BFS和双向BFS仅适用于有限状态数的最短路问题,状态的数量等于时间复杂度
- 状态的定义:数独?华容道?
分类 题号 题目 备注
基础状态建模 433 🟩最小基因变化 🟩重要
基础状态建模 752 🟩打开转盘锁 🟩重要
矩阵状态 BFS 1284 🟩转化为全零矩阵的最少反转次数 🟩重要
矩阵状态 BFS 773 🟩滑动谜题 🟩重要
字符串状态 BFS 127 🟦单词接龙 🟦重要 / 建议双向 BFS
字符串状态 BFS 301 🟦删除无效的括号 🟦经典扩展
字符串状态 BFS 854 🟦相似度为 K 的字符串 🟦难度偏高 / 剪枝练习
图论状压 847 🟦访问所有节点的最短路径 🟦经典 / 状态压缩
跳跃游戏类 1345 🟩跳跃游戏 IV 🟩重要
跳跃游戏类 2059 🟩转化数字的最小运算数 🟩重要
跳跃游戏类 1654 🟦到家的最少跳跃次数 🟦经典 / 有界 BFS
跳跃游戏类 2998 🟦使 X 和 Y 相等的最少操作次数 🟦扩展
跳跃游戏类 3629 🟦通过质数传送到达终点的最少跳跃次数 🟦扩展
会员题(跳过) 1197 进击的骑士 会员题
会员题(跳过) 3141 最大汉明距离 会员题
综合 / 较难 488 🟪祖玛游戏 难度偏高 / 模拟复杂
综合 / 较难 514 🟪自由之路 难度偏高 / 环形 DP+BFS
综合 / 较难 3690 🟪拆分合并数组 难度偏高
二、拓扑排序
分类 题号 题目 备注
前置理解 1557 🟩可以到达所有点的最少点数目 🟩重要 / 理解入度为0的点
基础拓扑排序 210 🟩课程表 II 🟩重要 / 输出拓扑序
基础拓扑排序 802 🟩找到最终的安全状态 🟩重要 / 反向图思维
拓扑 + 建图 2115 🟦从给定原材料中找到所有可以做出的菜 🟦经典 / 依赖关系建模
拓扑 + 矩阵 2392 🟦给定条件下构造矩阵 🟦扩展 / 行列双拓扑
拓扑 + 贪心 310 🟦最小高度树 🟦经典 / 剥洋葱法
拓扑 + 验证 1361 🟩验证二叉树 🟩重要 / 入度出度判定
难度偏高(跳过) 1591 奇怪的打印机 II 2291分 / 复杂模拟
难度偏高(跳过) 1203 项目管理 2419分 / 双层拓扑
难度偏高(跳过) 1632 矩阵转换后的排名 2530分 / 并查集+拓扑
难度偏高(跳过) 2603 收集树中金币 2712分 / 复杂树形DP
会员题(跳过) 444 序列重建 会员题
会员题(跳过) 269 / LCR 114 火星词典 会员题
会员题(跳过) 2371 最小化网格中的最大值 会员题
会员题(跳过) 3481 应用替换 会员题
三、在拓扑序上 DP
- 选作拓扑序DP
分类 题号 题目 备注
基础拓扑DP 851 🟦喧闹和富有 🟦重要 / 刷表法入门
基础拓扑DP 2050 🟦并行课程 III 🟦重要 / 最长路径DP
进阶拓扑DP 1857 🟦有向图中最大颜色值 🟦经典 / 颜色计数DP
会员题(跳过) 1136 并行课程 会员题
难度偏高(跳过) 3620 恢复网络路径 题目信息不完整
以下是对该题单的二次筛选结果,保留最具代表性、难度适中、降低解法重复的题目。
三、最短路
§3.1 单源最短路:Dijkstra 算法
分类 题号 题目 备注
基础入门 743 🟩网络延迟时间 🟩重要 / 标准模板题
基础入门 3341 🟩到达最后一个房间的最少时间 I 🟩重要 / 网格图Dijkstra入门
理解原理 3112 🟩访问消失节点的最少时间 🟩重要 / 理解节点失效时间
设计类 2642 🟩设计可以求最短路径的图类 🟩重要 / Dijkstra类的设计
概率类 1514 🟦概率最大的路径 🟦经典 / 乘积转加法
网格图 1631 🟦最小体力消耗路径 🟦经典 / 多种解法
网格图 778 🟦水位上升的泳池中游泳 🟦经典 / 与1631类似但不同
网格图 2577 🟦在网格图中访问一个格子的最少时间 🟦扩展 / 时间依赖等待
计数类 1976 🟦到达目的地的方案数 🟦经典 / 最短路计数
第二短路径 2045 🟦到达目的地的第二短时间 🟦经典 / BFS也可
K站中转 787 🟦K站中转内最便宜的航班 🟦经典 / 与1928类似,选更经典的
动态规划 1928 🟦规定时间内到达终点的最小花费 🟦扩展 / DP+Dijkstra
赛车 818 🟪赛车 难度偏高 / 状态图BFS+DP
分层图 LCP 35 🟦电动车游城市 🟦经典 / 分层图入门
SPFA/差分约束 2589 🟦完成所有任务的最少时间 🟦扩展 / 差分约束
§3.2 全源最短路:Floyd 算法
Floyd 算法本质是三维 DP。理解 DP 一定要基于空间优化前的写法。
- 转换字符串的最小成本:这题不能用BFS来做,状态空间很大 。不过可以抽象为最短路来做,先单独求解每一个字符转换的最小成本。因为有多个字符,所以使用多源最短路算法。
--
-
设计可以求最短路径的图类 1811 动态加边
-
阈值距离内邻居最少的城市 1855
-
转换字符串的最小成本 I 1882
-
关闭分部的可行集合数目 2077
-
转换字符串的最小成本 II 2696
四、最小生成树
涉及到 Kruskal 算法和 Prim 算法。前者一般用于稀疏图,后者一般用于稠密图。
- 一般使用堆优化的Krusal算法。
- 最小带权和的生成树。
--
-
连接所有点的最小费用 1858
-
升级后最大生成树稳定性 2301 做法不止一种:二分+Krusal算法
-
找到最小生成树里的关键边和伪关键边 2572
-
最低成本连通所有城市(会员题)
-
水资源分配优化(会员题)
七、二分图染色
- 二分图:两个节点连边。
- 典型例题:分组织问题。
模板(交替染色法):
-
判断二分图 1625
-
可能的二分法 1795
-
最大划分因子 2135:只保留有用的边+二分