图论

图论 Graph Theory

基础

  • 图的遍历

    A Path in A Dictionary:找出最小字典序简单路径,对于每个点,按照字典序搜索下一个点,如果第一次搜这点却不能到达终点,那下次就没有必要搜索

  • 建图思想
    Train Wreck:任意入栈后的栈不能相同,那么模拟,可以构造出一个树来表示所有时刻的栈,那么此时就可以由此构造一个图来表示,方便后续的处理

  • 思维题
    B - Triangle Toggle : 注意到一次操作,对顶点的黑边数的影响分别是0,-2,+2,,所以最终一个顶点最大的黑边数与初始黑边数同奇偶

树 Tree

  • 基础
    在树(或二叉树等树形结构)中,节点的 “度”指的是该节点拥有的子节点的数量

    叶节点,叶节点是度为0的节点:D. Arboris Contractio:最终的图是菊花图,因此找出最小的点使得其直接相连的非叶节点最少
    -二叉树

    1. 对于任意二叉树,结点总数n由度为 0(叶子结点)、度为 1、度为 2的结点数之和组成
    2. 对于任意二叉树,度为 0 的结点数比度为 2 的结点数多 1
  • 计数问题
    Pair Counting: 理解好题意,题解
    F. Tree, TREE!!!:注意集合是怎么构成的

树的直径

  1. 两遍dfs .第一次dfs,任取一个点,找到离开该点距离最大的点,第二次dfs,以该点为起点,找到离该点最远的点,此时两点距离即为树的直径
  2. 树形dp .记录每一个u的向子树延申的最长路和次长路,直径就是max(最长路和次长路之和)

3760. 最大剩余油量:树形dp做法,求权值最大值

并查集

最近公共祖先

倍增法:

倍增法虽然比树剖法慢,但是也有优点,比如可以求第几级祖先:

点击查看代码 ``` ll kth(ll u,ll k){//u的往上走第k个祖先 for(int i=0;i<=20;++i){ if((k>>i)&1) u=f[u][i]; } return u; } ```

F - Sum of Mex题解,直接求不易,考虑贡献法,先找出包含[0,x]的最小链,考虑左右端点子树点的数量,因为任取两个子树的端点能够包含这条链,从而对答案有贡献,特殊考虑x是端点的情况,不包含该链的子树的其他点都可以考虑选取作为一个端点,于是不断扩大[0,x+1],....,[0,n],更具体看题解和代码

dfs序

树链剖分:

小红的树不动点:不断找满满足第i个点是不动点子树的深度dep,会有个dep个子树满足第i个点是不动点子树

利用最近公共祖先求树的简单路径

点击查看代码
	return dep[u]+dep[v]-dep[lca(u,v)];

最小生成树

一般有两种算法:Kruskal算法和Prim算法
次小生成树:题解

  • 增加理解:AcWing 346. 走廊泼水节:加深你对最小生成树边权的理解,两个完全图(节点数分别是a,b)合并成完全图需要a*b个边
  • 超级源点:应对既有点权还有边权,求最小值时,将点权转化为由超级源点(一般为0)指向该点的边权,再求最小生成树
    练习题:
    1. [USACO08OCT] Watering Hole G
    2. CF1245D. Shichikuji and Power Grid
  • 最大生成树:有时候需要构造最大生成树.
    连通块的思想:
  • 最小限度生成树:先不连s,划分成连通块求最小生成树,再相连
  • 野餐规划:上一题是恰好k个,这一题是可以[1,k]个

上述两题的实现在于同时记录并查集合并时边的信息,利用冗余信息优化解题

异或最小生成树:

图论

拓扑排序

拓扑排序(Topological Sorting)是针对有向无环图(DAG, Directed Acyclic Graph)的一种排序方式。在这种排序中,图中的所有顶点被排列成一个线性序列,满足若从顶点A到顶点B有一条路径,则顶点A必须在序列中出现在顶点B之前。这样的序列称为满足拓扑次序的序列,或简称为拓扑序列。

  • 基础
    拓扑序:
    构造有向无环图:有向边若可以构成拓扑序,那么无向图就可以分配方向构成拓扑序视频题解

    C. Max Tree:因为是树,所以无环,题目的条件仅仅让你决定边的方向,于是形成拓扑图,以此来决定答案

  • 与状态压缩结合
    可达性统计

E. Minimal Labels:直接拓扑排序的话有后效性贪心是错误的,反向建图消除后效性就可以贪心了,因为当前选择最小值,会影响之后选择最小值,而反向建图则不会
AcWing 3813. 最大路径权值

最短路

  • Floyd算法
    Floyd算法中使用前k个节点更新最短路的思维:

  • dijkstra算法

    • 最短路模板
    • 次短路
      次短路基于最短路算法,再更新最短路的同时记录次短路
    • 最短路计数:最短路距离更小方案数直接由前一个点转移,最短路距离相同累加方案数
    • 建反图/反向遍历:可以将原图建在每个点+n之后
      邮寄员送信
      3772. 更新线路:反向建图,根据给定路径判断,如果路径上当前的点到下一个点在某个一最短路,那么最小导航不必更新,如果当前点由多个点转移而来,那么最大次数可以更新。如果两点之间不在同一个最短路上,那么必然导航更新(类似于最短路计数)
      AcWing 3797. 最大化最短路:
  • spfa算法: 负环

    • [NOIP 2009 提高组] 最优贸易:有环就可能需要用到spfa,双向spfa

      此题也启发我们,最短路算法不一定用来求两点之间最短距离,也可以用来求两点之间路径上的最大值或者最小值

    • SLF优化算法.道路与航线:板子优化
  • 分层图:这一层到下一个层,为出现的特殊情况,分多少层取决于出现的次数

    • 通信线路
    • [NOIP 2009 提高组] 最优贸易: 此题亦可用分层图来写,第一层到第二层同一点的边权为水晶球的负值,表示买入,第二层到第三层同一点的边权为水晶球的正值,表示卖出,这样就形象地表示买入卖出,到3*n的点最短路就是赚的钱
    • 分层图有时候会出现内存不够的情况
      • 可以考虑建立中转节点来实现层与层的转化,同时也不必使每一层都完整,离散化点的编号
      • 或者只分两层,滚动求最短路,Asia EC Online 2025 (I) M. Teleporter
  • 异或最短路
    G. Shortest Path Problem?:参考题解,需要先学习线性基

  • 状压最短路
    G. Rudolf and CodeVid-23

  • 最短路树
    边的删减:求完单源最短路会形成一个棵树,保留k条边最多有k+1个顶点,再树中从单源找一个k个点形成的连通块就行

图论的连通性

连通性:主要考察连通性,割点,割边,缩点

连通图的特性:

  1. 无向连通图:核心是 “无孤立点”(n≥2 时度≥1);
  2. 有向强连通图:核心是 “双向可达”(n≥2 时入度≥1 且出度≥1);
  3. 有向弱连通图:核心是 “无向连通”(对入度 / 出度无约束);
  4. 单点图:所有连通类型中,度(入度 / 出度)均为 0,是万能特例。
  • 连通性
    图在建立时的连通性就在变化:
    P2700 逐个击破:该题给定K个点不能连通,逆向思考,如果建图的时候,保证这个k个点始终不连通,那么就达成了目标

    连通分量
    图的连通分量:难点主要在遍历联通的点上,从二进制角度思考,对于整数x,应该遍历x取反后,所有1的位置组成的二进制子集。题解

  • 缩点
    模仿者:简单题
    P2812 校园网络【[USACO]Network of Schools加强版】:简化成DAG图,对于问题 A 答案显然为入度为 0 的点的个数,对于问题 B 。我们要把它变成连通图,连通图需要满足:没有入度为 0 的点,没有出度为 0 的点,考虑入度为 0 和 出度为 0 的点两两匹配,则需要匹配 max{入度为 0 的点,入度为 1 的点 }次。

  • 割点
    P3469 [POI 2008] BLO-Blockade:考察连通块的思想,tarjan算法,对于去除i点之后有多少个不能连通的(u,v),首先它本身不能与剩下n-1个点连通,其次对于他的一个子树内的所有点不能与其他点相连,最后除去他的所有子树节点的节点不能与其他点相连

二分图

P3386 [模板]二分图最大匹配:利用增广路增加匹配
P2071 座位安排: 人是一半图,座位是一半图
P372. 棋盘覆盖: 注意到,骨牌覆盖的两点一定是i+j奇偶不同,所以可以考虑根据奇偶性分为两个子集,每一条连接的边就是一个骨牌,最大匹配就是最多骨牌

网络流

Edmonds−Karp增广路算法 和 Dinic算法
P3376 【模板】网络最大流

posted @ 2025-10-05 13:18  归游  阅读(17)  评论(0)    收藏  举报