竞赛图随记

竞赛图的定义

对于一张无自环的有向图 \(G\),如果每对不同节点之间都恰有一条有向边,则称 \(G\) 是竞赛图。

竞赛图缩点后是一条链

考察竞赛图 \(G = (V, E)\) 缩点后的强连通分量,我们给它们任意指定一个拓扑序。不难发现,\(\forall u, v \in V\),如果 \(u, v\) 所属强连通分量不同且 \(u\) 所属的强连通分量在拓扑序上更靠前,则必有 \((u, v) \in E\)。因此,竞赛图 \(G\) 缩点后形成了一条链。

竞赛图与哈密顿路

竞赛图有哈密顿路径(Redei 定理)

证明

对于一张竞赛图 \(G = (V, E)\),我们可以通过归纳构造出它的一条哈密顿路径。

假设我们已经在点 \(1\)\(i - 1\) 的导出子图中找出了一条哈密顿路径 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_{i - 1}\)

如果 \((p_{i - 1}, i) \in E\),我们把路径变为 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_{i - 1} \rightarrow i\)

否则如果 \((i, p_1) \in E\),我们把路径变为 \(i \rightarrow p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_{i -1}\)

否则找到最小的下标 \(x\) 满足 \((i, p_x) \in E\),由不满足上述两个条件可知 \(x\) 存在且 \(x > 1\),我们把路径变为 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_{x - 1} \rightarrow i \rightarrow p_x \rightarrow \dots \rightarrow p_{i - 1}\)

初始令 \(p_1 \leftarrow 1\),我们依次加入点 \(2\)\(n\)。当 \(n\) 个点都被加入后,\(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_n\) 即为一条哈密顿路径。

由上,我们可以 \(O(n^2)\) 构造出一个 \(n\) 阶竞赛图的哈密顿路径。

代码

fill(nxt + 1, nxt + n + 1, 0);
int l = 1, r = 1;
for (int i = 2; i <= n; ++i) {
  if (g[r][i]) {
    nxt[r] = i;
    r = i;
  } else if (g[i][l]) {
    nxt[i] = l;
    l = i;
  } else {
    for (int x = l;; x = nxt[x]) {
      if (g[i][nxt[x]]) {
        nxt[i] = nxt[x];
        nxt[x] = i;
        break;
      }
    }
  }
}

强连通竞赛图有哈密顿回路(Camion-Moon 定理)

证明

对于一张强连通的竞赛图 \(G = (V, E)\),我们可以通过归纳在它的一条哈密顿路径的基础上构造出一条哈密顿回路。

我们找出一条哈密顿路径,把每个点按照它在哈密顿路径上的位置重标号。即重标号后我们有 \(\forall i \in [1, n - 1] \cap \mathbb{Z}, (i, i + 1) \in E\)

假设我们已经把点 \(1\)\(i - 1\) 分成了两个部分:一个环 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_k \rightarrow p_1\) 和一条路径 \(k + 1 \rightarrow k + 2 \rightarrow \dots \rightarrow i - 1\),满足 \(\forall x \in [1, k] \cap \mathbb{Z}, \forall y \in [k + 1, i - 1] \cap \mathbb{Z}, (p_x, y) \in E\)

如果 \(\forall x \in [1, k] \cap \mathbb{Z}, (p_x, i) \in E\),我们把路径变为 \(k + 1 \rightarrow k + 2 \rightarrow \dots \rightarrow i - 1 \rightarrow i\)

否则,找到任意 \(x\) 满足 \((i, p_x) \in E \land (p_{x - 1}, k + 1) \in E\),由 \((i - 1, i) \in E\) 可知存在这样的 \(x\),我们把环变为 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_{x - 1} \rightarrow k + 1 \rightarrow k + 2 \rightarrow \dots \rightarrow i \rightarrow p_x \rightarrow \dots \rightarrow p_k \rightarrow p_1\),然后令 \(k \leftarrow i\)

初始我们找到最小的 \(x\) 满足 \((x, 1) \in E\),由 \(G\) 强连通可知 \(x\) 存在,令 \(k \leftarrow x, \forall i \in [1, x] \cap \mathbb{Z}, p_i \leftarrow i\)。我们依次加入点 \(x + 1\)\(n\)。当 \(n\) 个点全部被加入后,必有 \(k = n\),否则与 \(G\) 强连通矛盾。\(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_n \rightarrow p_1\) 即为一条哈密顿回路。

由上,我们可以 \(O(n^2)\) 构造出一个 \(n\) 阶强连通竞赛图的哈密顿回路。

代码

fill(nxt + 1, nxt + n + 1, 0);
int l = 1, r = 1;
for (int i = 2; i <= n; ++i) {
  if (g[r][i]) {
    nxt[r] = i;
    r = i;
  } else if (g[i][l]) {
    nxt[i] = l;
    l = i;
  } else {
    for (int x = l;; x = nxt[x]) {
      if (g[i][nxt[x]]) {
        nxt[i] = nxt[x];
        nxt[x] = i;
        break;
      }
    }
  }
}
r = 0;
for (int i = l; i; i = nxt[i]) {
  if (!r) {
    if (g[i][l]) r = i;
    continue;
  }
  if (g[i][l]) {
    r = i;
  } else {
    for (int x = l; x != r; x = nxt[x]) {
      if (g[x][nxt[r]] && g[i][nxt[x]]) {
        int t = nxt[x];
        nxt[x] = nxt[r];
        nxt[r] = l;
        l = t;
        r = i;
        break;
      }
    }
  }
}
nxt[r] = l;

强连通竞赛图是泛圈的(Camion-Moon 定理推论)

对于一张 \(n\) 阶有向图 \(G\),如果 \(\forall i \in [3, n] \cap \mathbb{Z}\)\(G\) 含有长度为 \(i\) 的环,则称 \(G\) 是泛圈的。

证明

\(n \le 3\) 时定理成立,我们可以通过归纳证明该定理。

不难发现我们只需要证明 \(\forall n \in [4, +\infty) \cap \mathbb{Z}\)\(n\) 阶强连通竞赛图含有长度为 \(n - 1\) 的环。这是因为长度为 \(n - 1\) 的环的点集的导出子图是一个 \(n - 1\) 阶强连通竞赛图,根据归纳假设 \(\forall i \in [3, n - 1] \cap \mathbb{Z}\),它含有长度为 \(i\) 的环。又因为我们已经证明了 \(n\) 阶强连通竞赛图有哈密顿回路,即长度为 \(n\) 的环,所以原定理得证。

考察 \(n\) 阶竞赛图的一条哈密顿回路 \(p_1 \rightarrow p_2 \rightarrow \dots \rightarrow p_n \rightarrow p_1\)。我们在原图中删去点 \(p_1\),如果剩下的部分强连通则容易找出长度为 \(n - 1\) 的环,否则剩下的部分缩点后形成了一条链。

\(p_2 \rightarrow p_3 \rightarrow \dots \rightarrow p_n\) 一定是由链上每个强连通分量的一条哈密顿路径按拓扑序依次拼接而成。如果其中有一条哈密顿路径的长度 \(> 1\),我们一定可以“跳过”它的开头或末尾节点。否则,所有强连通分量大小都为 \(1\),因为 \(n > 3\),我们一定可以“跳过”一个中间的强连通分量。

这样,我们就“跳过”了哈密顿回路上的一个节点,即构造出了一个长度为 \(n - 1\) 的环。

竞赛图与出度序列

竞赛图合法出度序列(Landau 定理)

给定一个非负整数序列 \(p_1 \le p_2 \le \dots \le p_n\) 满足 \(\sum_{i = 1}^n p_i = \binom{n}{2}\),存在一个竞赛图使得节点的出度分别为 \(p_1, p_2, \dots, p_n\) 的充要条件是 \(\forall i \in [1, n] \cap \mathbb{Z}, \sum_{j = 1}^i p_j \ge \binom{i}{2}\)

必要性证明

\(\forall i \in [1, n] \cap \mathbb{Z}\),度数为 \(p_1\)\(p_i\) 的节点的导出子图有 \(\binom{i}{2}\) 条边,因此 \(\sum_{j = 1}^i p_j \ge \binom{i}{2}\)

充分性证明

考虑构造一个 \(n\) 阶竞赛图 \(G = (V, E)\) 满足出度序列是 \(p\)

初始令 \(E = \{(i, j) \mid i, j \in V, i > j\}\),此时从小到大排序后出度序列为 \(\forall i \in [1, n] \cap \mathbb{Z}, q_i = i - 1\)。观察到 \(\forall i \in [1, n] \cap \mathbb{Z}, \sum_{j = 1}^i q_j = \binom{i}{2} \le \sum_{j = 1}^i p_j\),我们尝试在保持 \(\sum_{j = 1}^i q_j \le \sum_{j = 1}^i p_j\) 的条件下调整 \(q\) 直到 \(q = p\)

找到最小的下标 \(x\) 满足 \(q_x \neq p_x\),由于 \(\sum_{i = 1}^x q_i \le \sum_{i = 1}^x p_i\) 所以 \(q_x < p_x\)。再找到最小的下标 \(y\) 满足 \(q_y > p_y\),由于 \(\sum_{i = 1}^n q_i = \sum_{i = 1}^n p_i\),所以 \(y\) 存在。显然 \(y > x\),因此 \(q_y > p_y \ge p_x > q_x\),进而 \(q_y \ge q_x + 2\)

\(q_x\) 对应节点为 \(u\)\(q_y\) 对应节点为 \(v\)。因为 \(q_x < q_y\),所以要么 \((v, u) \in E\),要么 \(\exists p, (v, p) \in E \land (p, u) \in E\)。如果是前者,我们反转边 \((v, u)\);如果是后者,我们反转边 \((v, p)\) 和边 \((p, u)\)

上述操作会使 \(u\) 的出度 \(+1\)\(v\) 的出度 \(-1\)。因为 \(q_x + 2 \le q_y\),所以 \(u\) 的出度仍然不大于 \(v\) 的出度,进而在从小到大排序后的出度序列 \(q\) 上的影响可以体现为我们会使区间 \([l, r]\) 的前缀和 \(+1\),其中 \([l, r] \subseteq [x, y - 1]\)。因为 \(y\) 是最小的满足 \(q_y > p_y\) 的下标,所以 \(\forall i \in [x, y - 1] \cap \mathbb{Z}, \sum_{j = 1}^i q_j < \sum_{j = 1}^i p_j\),所以区间 \([l, r]\) 的前缀和 \(+1\) 后仍然满足条件。

不难发现有限次调整后可以满足 \(q = p\)

竞赛图强连通分量个数(Landau 定理推论)

记竞赛图 \(G\) 的出度序列为 \(p_1 \le p_2 \le \dots \le p_n\)\(G\) 的强连通分量个数为 \(\sum_{i = 1}^n [\sum_{j = 1}^i p_j = \binom{i}{2}]\)

证明

\(G\) 缩点后形成了一条链,拓扑序上靠后的强连通分量里节点的出度一定严格小于靠前的强连通分量里节点的出度。考察链上相邻两个强连通分量 \(S, T\),不妨假设 \(S\) 在拓扑序上比 \(T\) 靠前。我们一定能找到一个唯一的 \(x\),使得 \(p_1\)\(p_x\) 一一对应着 \(T\) 以及在拓扑序上比 \(T\) 更靠后的强连通分量里节点的出度。显然,\(\sum_{i = 1}^x p_i = \binom{x}{2}\),因此 \(\sum_{i = 1}^n [\sum_{j = 1}^i p_j = \binom{i}{2}]\) 不小于 \(G\) 的强连通分量个数。

同时,\(\forall x \in [1, n - 1] \cap \mathbb{Z}, \sum_{i = 1}^x p_i = \binom{x}{2}\)\(p_{x + 1}\)\(p_n\) 对应的节点都向 \(p_1\)\(p_x\) 对应的节点连边,所以 \(x\) 也唯一对应着链上相邻两个强连通分量的分界,因此 \(\sum_{i = 1}^n [\sum_{j = 1}^i p_j = \binom{i}{2}]\) 不大于 \(G\) 的强连通分量个数。

综上,\(\sum_{i = 1}^n [\sum_{j = 1}^i p_j = \binom{i}{2}]\) 等于 \(G\) 的强连通分量个数。

在求出出度序列后,通过桶排,我们可以 \(O(n)\) 求解一个 \(n\) 阶竞赛图的强连通分量个数。

竞赛图最小割

求解竞赛图 \(G = (V, E)\)\(s - t\) 割时,我们初始令 \(S \leftarrow \{s\}, T \leftarrow V \backslash \{s\}\),考虑不断把 \(T\) 中的点移动到 \(S\) 中,直到 \(\{S, T\}\) 成为最小割。记 \(cst_u\) 表示把 \(u\)\(T\) 中移动到 \(S\) 中对最小割产生的变化量。

\[\begin{aligned} cst_u &= \sum_{i \in T} [(u, i) \in E] - \sum_{i \in S} [(i, u) \in E] \\ &= \sum_{i \in T} [(u, i) \in E] - (|S| - \sum_{i \in S} [(u, i) \in E]) \\ &= (\sum_{i = 1}^n [(u, i) \in E]) - |S| \end{aligned} \]

发现 \(cst_u\) 只和 \(u\) 的出度和 \(|S|\) 有关。

将所有除了 \(s, t\) 之外的点按照出度从小到大排序,不难发现最小割一定是把一个前缀里的点从 \(T\) 中移到 \(S\),否则调整成一个前缀一定更小。

记除了 \(s, t\) 之外的点的出度序列从小到大排序后为 \(p_1 \le p_2 \le \dots \le p_{n - 2}\)\(s - t\) 最小割即为

\[\sum_{i = 1}^n [(s, i) \in E] + \min_{i = 0}^{n - 2} \sum_{j = 1}^i (p_j - j) \]

在求出出度序列后,通过桶排,我们可以 \(O(n)\) 求解一个 \(n\) 阶竞赛图的 \(s - t\) 割。

进一步地,通过 ST 表 \(O(n \log n)\) 预处理区间最小值,我们可以 \(O(1)\) 在线回答一个 \(n\) 阶竞赛图的 \(s - t\) 割。

例题

POI2017 Turysta

竞赛图缩点后是一条链,且每个强连通分量都有哈密顿回路。

求出每个强连通分量的哈密顿回路。每个点都能先沿着它所在的强连通分量 \(S\) 的哈密顿回路遍历所有 \(S\) 中的节点,然后再依次遍历拓扑序上在 \(S\) 之后的其他强连通分量的节点。

提交记录

CF1268D Invertation in Tournament

手玩不难发现,当原图非强连通时,大概率 \(1\) 次操作就可以让原图强连通。

如果原图缩点后形成了 \(> 2\) 个强连通分量,任取一个不属于链头链尾两个强连通分量的点进行一次操作,不难发现这能使原图强连通。

否则如果存在一个强连通分量的大小 \(x\) 满足 \(x > 3\),那么根据 Camion-Moon 定理的推论,它必然包含一个长度为 \(x - 1\) 的环。在那个不在环上的点上进行一次操作,不难发现这能使原图强连通。

否则原图满足 \(n \le 6\)

综上,当 \(n \le 6\) 时暴力枚举每一种操作方案判断。

否则,枚举每个点,判断在它上面做一次操作之后原图是否强连通。可以使用 Landau 定理的推论 \(O(n)\) 判断。

时间复杂度 \(O(n^2)\)

提交记录

CTT2020 Day2 C 基础图论练习题

根据 Landau 定理的推论,我们只需要对于每一条边求出反转它后从小到大排序的度数序列 \(p\)\(\sum_{i = 1}^n [\sum_{j = 1}^i p_j = \binom{i}{2}]\) 即可。

容易发现反转一条边对从小到大排序后的度数序列的改变是 \(O(1)\) 的,通过若干前缀和数组求解上式即可。

时间复杂度 \(O(n^2)\)

提交记录

posted @ 2023-09-27 15:32  JCY_std  阅读(216)  评论(0编辑  收藏  举报