本文主要讲解:网络流,二分图染色,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)\) 个代表之间的双向厌恶关系。

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

图论 III的更多相关文章

  1. 洛谷P5151 HKE与他的小朋友 快速幂/图论+倍增

    正解:矩阵快速幂/tarjan+倍增 解题报告: 传送门! 跟着神仙做神仙题系列III 这题首先一看到就会想到快速幂趴?就会jio得,哦也不是很难哦 然而,看下数据范围,,,1×105,,,显然开不下 ...

  2. 【学时总结】 ◆学时·III◆ 二分图

    [学时·III] 二分图 ■基本策略■ 其实本质是图论中的网络流 二分图是两个由多个点组成的集合(上部和下部,且没有重叠),两个集合中的点不与该集合内其他的点连通,但和另一个集合内的点连通.我们称这两 ...

  3. [leetcode] 题型整理之图论

    图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...

  4. 用Kotlin开发Android应用(III):扩展函数和默认值

    这是关于Kotlin的第三篇. 原文标题:Kotlin for Android (III): Extension functions and default values 原文链接:http://an ...

  5. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  6. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  7. 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律

    F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ...

  8. LeetCode——Best Time to Buy and Sell Stock III (股票买卖时机问题3)

    问题: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  9. 1. Two Sum I & II & III

    1. Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  10. 【LeetCode】Single Number I & II & III

    Single Number I : Given an array of integers, every element appears twice except for one. Find that ...

随机推荐

  1. 用DevEco Studio增量补丁修复功能,让鸿蒙应用的调试效率大增

    在鸿蒙应用开发的快节奏赛道上,每一秒的开发效率提升都至关重要.如何更快地看到代码更改后的效果?如何尽可能缩短开发.调试和验证的周期?如何做到在某大厂180万行+项目中将代码修改即时生效?这些问题在De ...

  2. Linux From Scratch 12.2 systemd 编译安装成功留念

    Linux From Scratch 12.2 Systemd 留念 Linux From Scratch 12.2 Systemd 总耗时约一周完结.写下这篇以作留念. 要始终把精力放在解决问题上面 ...

  3. 【经验】Python3|输入多个整数(map方法或ctypes调用C标准库scanf)

    文章目录 方法一:多次调用input 1. 代码 方法二:调用C标准库 1. 代码 2. 残留的问题(int数组取元素) 附:计算时间差的程序(使用实例) 第一种读取方式: 第二种读取输入方式: 方法 ...

  4. 递归神经网络 RNN 原理(下)

    基于对 RNN 的初步认识, 还是先回顾一下它核心的步骤: (1) words / onehot vectors : \(x^{(t)} \in R^{|v|}\) **(2) word embedd ...

  5. 【晴神宝典刷题路】codeup+pat 题解索引(更新ing

    记录一下每天的成果,看多久能刷完伐 c2 c/c++快速入门 <算法笔记>2.3小节--C/C++快速入门->选择结构 习题4-10-1 奖金计算 <算法笔记>2.4小节 ...

  6. 面试官说又逮到一个不会用Git的

    这里这写简要,要看具体的步骤及解释清移步:https://www.bilibili.com/read/cv10510952 如果是自己创建仓库写代码上传(demo是自己仓库的自定义名字): git i ...

  7. SQL注入入门实例讲解(NewsCenter

    今天写了个sql注入的题目(也是跟着教程做的hhh),过程中有些心得体会,想着写篇博客总结一下. 笔者也是初学者,如有哪里讲错了,欢迎大佬在评论区点出 题目来源:攻防世界web进阶区,NewsCent ...

  8. WPF关于 附加属性绑定异常 ,导致页面加载缓慢

    最近项目在启动的时候,经常出现Xmal的类型转换的异常  :引发的异常:"MS.Internal.Xaml.Parser.GenericTypeNameParser.TypeNamePars ...

  9. C++函数重载的一点问题

    问题 #include <iostream> #include <vector> enum A { Value = 1 }; void a(std::vector<int ...

  10. MySQL中自增长序列(@i:=@i+1)的用处及用法

    问题分析    Oracle中的伪列 ROWNUM 是一组递增的序列,在查询数据时生成,为结果集中每一行标识一个行号, 每条记录会因为输出的顺序不同而获得不同的逻辑编号:此自增长序列可以视作起始值为 ...