图论 III

本文主要讲解:网络流,二分图染色,2-sat,差分约束

定义与记号

基本定义

  • 图:一张图 \(G\) 由若干个点和连接这些点的边构成。点的集合称为 点集 \(V\),边的集合称为 边集 \(E\),记 \(G = (V, E)\)。
  • 阶:图 \(G\) 的点数 \(|V|\) 称为 ,记作 \(|G|\)。
  • 无向图:若 \(e\in E\) 没有方向,则 \(G\) 称为 无向图 。无向图的边记作 \(e = (u, v)\),\(u, v\) 之间无序。
  • 有向图:若 \(e\in E\) 有方向,则 \(G\) 称为 有向图 。有向图的边记作 \(e = u\to v\) 或 \(e = (u, v)\),\(u, v\) 之间有序。无向边 \((u, v)\) 可视为两条有向边 \(u\to v\) 和 \(v\to u\)。
  • 重边:端点和方向(有向图)相同的边称为 重边 ,当且仅当对于两条边 \(e_1=(u,x),e_2=(u,y)\) 中 \(x=y\)。
  • 自环:连接相同点的边称为 自环 ,当且仅当 \((u,v)\) 中 \(u=v\)。

相邻

  • 相邻:在无向图中,称 \(u, v\) 相邻 当且仅当存在 \(e = (u, v)\)。
  • 邻域:在无向图中,点 \(u\) 的 邻域 为所有与之相邻的点的集合,记作 \(N(u)\)。
  • 邻边:在无向图中,与 \(u\) 相连的边 \((u, v)\) 称为 \(u\) 的 邻边
  • 出边 / 入边:在有向图中,从 \(u\) 出发的边 \(u\to v\) 称为 \(u\) 的 出边 ,到达 \(u\) 的边 \(v\to u\) 称为 \(u\) 的 入边
  • 度数:一个点的 度数 为与之关联的边的数量,记作 \(d(u)\),\(d(u) = \sum_{e\in E} ([u = e_u] + [u = e_v])\)。点的自环对其度数产生 \(2\) 的贡献。
  • 出度 / 入度:在有向图中,从 \(u\) 出发的边数称为 \(u\) 的 出度 ,记作 \(d ^ +(u)\);到达 \(u\) 的边数称为 \(u\) 的 入度 ,记作 \(d ^ -(u)\)。

路径

  • 途径:连接一串相邻结点的序列称为 途径 ,用点序列 \(v_{0..k}\) 和边序列 \(e_{1..k}\) 描述,其中 \(e_i = (v_{i - 1}, v_i)\)。常写为 \(v_0\to v_1\to \cdots \to v_k\)。
  • 迹:不经过重复边的途径称为
  • 回路:\(v_0 = v_k\) 的迹称为 回路
  • 路径:不经过重复点的迹称为 路径 ,也称 简单路径。不经过重复点比不经过重复边强,所以不经过重复点的途径也是路径。注意题目中的简单路径可能指迹。
  • 环:除 \(v_0 = v_k\) 外所有点互不相同的途径称为 ,也称 简单环

连通性

  • 连通:对于无向图的两点 \(u, v\),若存在途径使得 \(v_0 = u\) 且 \(v_k = v\),则称 \(u, v\) 连通
  • 弱连通:对于有向图的两点 \(u, v\),若将有向边改为无向边后 \(u, v\) 连通,则称 \(u, v\) 弱连通
  • 连通图:任意两点连通的无向图称为 连通图
  • 弱连通图:任意两点弱连通的有向图称为 弱连通图
  • 可达:对于有向图的两点 \(u, v\),若存在途径使得 \(v_0 = u\) 且 \(v_k = v\),则称 \(u\) 可达 \(v\),记作 \(u \rightsquigarrow v\)。
  • 关于点双连通 / 边双连通 / 强连通,见对应章节。

特殊图

  • 简单图:不含重边和自环的图称为 简单图
  • 基图:将有向图的有向边替换为无向边得到的图称为该有向图的 基图
  • 有向无环图:不含环的有向图称为 有向无环图 ,简称 DAG(Directed Acyclic Graph)。
  • 完全图:任意不同的两点之间恰有一条边的无向简单图称为 完全图 。\(n\) 阶完全图记作 \(K_n\)。
  • 树:不含环的无向连通图称为 ,树上度为 \(1\) 的点称为 叶子 。树是简单图,满足 \(|V| = |E| + 1\)。若干棵(包括一棵)树组成的连通块称为 森林。相关知识点见 "树论"。
  • 稀疏图 / 稠密图: \(|E|\) 远小于 \(|V| ^ 2\) 的图称为 稀疏图 ,\(|E|\) 接近 \(|V| ^ 2\) 的图称为 稠密图 。用于讨论时间复杂度为 \(\mathcal{O}(|E|)\) 和 \(\mathcal{O}(|V| ^ 2)\) 的算法。

子图

  • 子图:满足 \(V'\subseteq V\) 且 \(E'\subseteq E\) 的图 \(G' = (V', E')\) 称为 \(G = (V, E)\) 的 子图 ,记作 \(G'\subseteq G\)。要求 \(E'\) 所有边的两端均在 \(V'\) 中。
  • 导出子图:选择若干个点以及两端都在该点集的所有边构成的子图称为该图的 导出子图 。导出子图的形态仅由选择的点集 \(V'\) 决定,记作 \(G[V']\)。
  • 生成子图:\(|V'| = |V|\) 的子图称为 生成子图
  • 极大子图(分量):在子图满足某性质的前提下,子图 \(G'\) 称为 极大 的,当且仅当不存在同样满足该性质的子图 \(G''\) 且 \(G'\subsetneq G''\subseteq G\)。\(G'\) 称为满足该性质的 分量。例如,极大的连通的子图称为原图的连通分量,也就是我们熟知的连通块。

约定

  • 记 \(n\) 表示点集大小 \(|V|\),\(m\) 表示边集大小 \(|E|\)。

1. 2-SAT

前置:强联通分量(Tarjan)、拓扑序、缩点

1.1 定义

给出 \(n\) 个变量,每个变量有一个取值集合,每个集合有两个元素 \({a_i,b_i}\)。已知若干个条件,表示 \(c_i\) 和 \(c_j\) 矛盾(即集合 \(i\) 选择 \(c_i\) 则集合 \(j\) 不能选择 \(c_j\))。

我们希望给每个变量赋值,判断是否存在一组解使得没有产生冲突。

1.2 解的存在性

我们通常建图后使用强联通分量解决 2-SAT 问题。

具体的,假设我们要处理条件 \([a_i,a_j]\),即集合 \(i\) 选择 \(a_i\) 则集合 \(j\) 不能选择 \(a_j\)。

我们建两条边:\((a_i,b_j)\) 和 \((a_j,b_i)\),含义为前者满足后者就必须满足。

其他条件用类似的方法处理建图。

之后我们求 scc。如果有一个集合的 \(a_i,b_i\) 在用一个 scc 里,其含义为如果选了 \(a_i\) 就必须选 \(b_i\),这肯定是无解的。否则就存在合法解。

1.3 构造合法解

我们按照图中拓扑序定向,如果 \(a_i\) 在 \(b_i\) 前面,那么取 \(a_i\),否则为 \(b_i\)。然而并不需要求一遍拓扑序,在 Tarjan 算法中我们维护的栈就是一个天然的拓扑序,所以求得的 scc 编号即为反拓扑序。

1.4 例题

1.4.1 P5782 [POI 2001] 和平委员会

题意

有 \(n(n\le8000)\) 个党派,每个党派有两个代表。有 \(m(m\le20000)\) 个代表之间的双向厌恶关系。

现在要成立一个委员会,要求每个党派恰好有一个代表在会中,且没有两个代表是互相厌恶的。构造合法解。

相关推荐
被AI抢饭碗的人1 天前
算法题(176):three states
数据结构·算法·图论
AICodeThunder1 天前
图论(1):多叉树
算法·深度优先·图论
Aurora_wmroy2 天前
算法竞赛备赛——【图论】求最短路径——小结
数据结构·c++·算法·蓝桥杯·图论
xindafu2 天前
代码随想录算法训练营第五十一天|图论part2
算法·图论
吗喽对你问好2 天前
Java机考题:815. 公交路线 图论BFS
java·图论·宽度优先
Aurora_wmroy3 天前
算法竞赛备赛——【图论】求最短路径——Floyd算法
数据结构·c++·算法·蓝桥杯·图论
w90953 天前
【9】斯特林数学习笔记
数学·学习笔记
方方土3334 天前
题解:CF1829H Don‘t Blame Me
数据结构·算法·图论
christ_lrs4 天前
Kruskal重构树
重构·图论