從擬陣基礎到 Shannon 開關遊戲

zghtyarecrenj發表於2021-08-28

從擬陣基礎到 Shannon 開關遊戲

本文中的定理名稱翻譯都有可能不準確!如果有找到錯誤的同學一定要聯絡我!

本文長期徵集比較好的例題,如果有比較典型的題可以聯絡我

目錄

Part 0. 前言

擬陣非常強大,非常優美,但是在演算法競賽中卻不常見。

你可能會說:這個容易,我 google 一下,部落格一大堆。

但是事實上擬陣的教程非常少,而且大部分都有大篇幅的代數證明或者講的及其不詳細,程式碼實現也不完全適合演算法競賽使用。

本文致力於把擬陣的內容講的儘量簡潔易懂,但是儘量不把重要定理和命題的證明丟掉。如果你看不懂其中的證明部分,你可以跳過,對理解後文幾乎沒有影響。閱讀本文不需要有線性代數知識,本文中只牽涉到可能和 OI 有關的內容。有興趣深入探討的讀者可以閱讀組合優化的書籍。

前置知識:

  1. Kruskal 演算法
  2. 匈牙利演算法
  3. 網路流

色覺障礙者可以沒有障礙地閱讀本文。(吐槽:原教程的圖一個紅色邊一個綠色邊讓我咋看啊……取色器救我一命)

P.S. 我在學這玩意的時候很多東西都是用英文講的,所以有一些詞不太會翻,如果翻譯有誤請評論區。

Part 1. 擬陣的定義

1.1 擬陣 Matroid

【定義】擬陣是一個對向量空間中線性獨立概念的概括與歸納的數學結構。

通俗的說,擬陣是描述獨立關係的結構。

一個擬陣 \(\mathcal M = \langle X,\mathcal I\rangle\),其中 \(X\) 被稱為 Ground Set\(\mathcal I\) 被稱為 Family of Sets,即 \(X\) 的獨立子集的集合。如果一個集合 \(I \in \mathcal I\) (請注意 \(I\)\(\mathcal I\) 之間的區別,一個是 I,一個是 \mathcal I,他們是不同的),則他是 \(X\) 的一個獨立子集。

【性質】一個擬陣必須有下列性質:

  1. \(X\) 是一個有窮集合。
  2. (遺傳性)一個獨立子集的所有子集都是獨立子集,即對於所有的 \(I \in \mathcal I, I' \subseteq I\),則有 \(I' \in \mathcal I\)。空集必須是獨立集。
  3. (交換性質)若 \(A,B \in \mathcal I, |A| < |B|\),則 \(\exists x \in B \setminus A\) 使得 \(A + \{x\} \in \mathcal I\)

如果我們需要證明一個形如 \(\langle X, \mathcal I\rangle\) 的東西是擬陣,我們只需要證明他滿足以上 3 條性質即可。

這是一個擬陣:\(\mathcal M = \langle \{x, y, z\},\mathcal \{\varnothing, \{x\}, \{y\},\{z\},\{x, y\}, \{x, z\}\}\rangle\)

1.2 基 Basis

【定義】所有極大獨立集組成了擬陣的,記號為 \(\mathcal B\)(即 \mathcal B,與 \(B\)B 有區別)。

【性質】

  1. 根據擬陣的第三條性質,擬陣中的極大獨立集一定是最大獨立集(否則可以加一個最大獨立集中的元素,與“極大”矛盾),即極大獨立集的大小都相等。
  2. 根據上一條,基中不存在一個元素為另一個元素的子集。
  3. 任何獨立集都是基中一個元素的子集。因為我們可以不停地在這個集合裡面新增元素直到他達到最大獨立集的大小。

所以我們可以用擬陣的基來描述一個擬陣的 Family of sets。

1.3 圈 Circuit

【定義】如果一個不獨立集合中除了本身以外的所有的子集都是獨立集,則這個不獨立集是一個

【性質】

  1. 顯然,圈中刪去任意一個或多個元素都會導致集合擁有獨立性。
  2. 根據上一條,不存在一個圈作為另一個圈的子集(否則不滿足第一條)。
  3. 每一個不獨立集的子集中一定含有一個圈。
  4. 兩個圈的並中刪除任意一個元素形成的集合的子集中仍然含有一個圈。(對於一些種類的擬陣對於圈 \(A\) 和圈 \(B\) 我們有 \((A \setminus B) \cup (B \setminus A)\) 包含一個圈)

所以我們可以用擬陣的所有圈來描述一個擬陣的 Family of sets。

1.4 秩 rank

【定義】擬陣的秩是 ground set 的最大獨立子集的大小。

【定義】秩函式 \(r(S)\) 表示 \(S\) 的最大獨立子集的大小。其中 \(S\) 必須是 ground set 的一個子集。\(r(S)\) 被稱為 \(S\) 的秩。

【性質】

  1. \(r(S) \le |S|\)
  2. \(r(\varnothing)=0\)
  3. 獨立集的秩為獨立集的大小。
  4. ground set 的秩等於擬陣的秩。
  5. (單調性)\(S\) 的子集的秩不大於 \(S\) 的秩。
  6. 若我們在 \(S\) 中加入一個元素,則 \(S\) 的秩要麼不變,要麼增加 \(1\)
  7. (次模性)\(r(A)+r(B) \geq r(A \cup B) + r(A \cap B)\)
  8. (次模性推論)\(r((A \setminus B) \cup (A \cap B)) + r((B \setminus A) \cup (A \cap B)) \geq r(A \cup B) + r(A \cap B)\)

只需要證明第一條,第五條和第七條性質就可以證明某個秩函式是合法的。

1.5 強基交換定理 Strong Basis Exchange Lemma

這部分柿子比較多,你可以只看結論不看證明。

【定義】定義 \(\operatorname{span}(A) = \{x \in X |\ r(A \cup \{x\}) = r(A)\}\)

【性質】

  1. 如果 \(A \subseteq B\),則 \(\operatorname{span}(A) \subseteq \operatorname{span}(B)\)

    Proof. 假設 \(e \in \operatorname{span}(A)\),由性質 7,\(r(A \cup \{e\})+r(B) \geq r((A \cup \{e\})\cap B) + r(B \cup \{e\} \geq r(A) + r(B \cup \{e\}))\)

    因為 \(e \in \operatorname{span}(A)\),我們有 \(r(A) = r(A \cup \{e\}) \implies r(B) \geq r(B \cup \{e\})\)

    \(\implies r(B) = r(B \cup \{e\}) \implies e \in \operatorname{span}(B)\)

    所以 \(\operatorname{span}(A) \subseteq \operatorname{span}(B)\)\(\square\)

  2. \(\forall x \in \operatorname{span}(A)\)\(\operatorname{span}(A) = \operatorname{span}(A \cup \{x\})\)

    Proof. 由性質 9,我們知道 \(\operatorname{span}(A) \subseteq \operatorname{span}(A \cup \{e\})\),所以我們只需要證明 \(\operatorname{span}(A \cup \{e\}) \subseteq \operatorname{span}(A)\)

    \(e \in \operatorname{span}(A), f \in \operatorname{span}(A \cup \{e\})\)。由性質 7,\(r(A \cup \{e\}) + r(A \cup \{f\}) \geq r(A \cup \{e, f\}) + r((A \cup \{e\}) \cap (A \cup \{f\})) \geq r(A \cup \{e, f\}) +r(A)\)

    因為 \(r(A) = r(A \cup \{e\})\),我們有 \(r(A \cup \{f\}) \geq r(A \cup \{e, f\}) \implies r(A \cup \{f\})=r(A \cup \{e, f\})\)

    所以 \(r(A \cup \{f\}) = r(A) \implies f \in \operatorname{span}(A)\)\(\square\)

  3. 由性質 10,我們有 \(\operatorname{span}(\operatorname{span}(A)) = \operatorname{span}(A)\)

【引理】令 \(B\)​ 和 \(B'\)​ 為 \(\mathcal B\)​ 的兩個元素。則 \(\forall x \in B \setminus B'\)​,\(\exists\ y \in B' \setminus B\)​ 使得 \(B \setminus \{x\} \cup \{y\} \in \mathcal B\)​ 並且 \(B' \setminus \{y\} \cup \{x\} \in \mathcal B\)​。

Proof. 假設 \(x \in B \setminus B'\)。因為 \(B' \in \mathcal B\)\(B' \cup \{x\}\) 包含一個圈 \(C\),並且 \(C\) 必須包含 \(x\)

所以 \(x \in \operatorname{span}(C - x) \implies x \in \operatorname{span}((B \cup C) \setminus \{x\})\)

根據以上性質,\(\operatorname{span}((B \cup C) \setminus \{x\}) = \operatorname{span}(B \cup C) = X\)

所以 \((B \cup C) \setminus \{x\}\)​ 包含了一個基中的元素 \(B''\)​。則 \(B \setminus \{x\}\)​ 和 \(B''\)​ 都具有獨立性,並且 \(|B''| > |B - x|\)​。

所以 \(\exists \ y \in B'' \setminus(B \setminus \{x\})\) 滿足 \((B \setminus \{x\}) \cup \{y\} \in \mathcal B\)

\(B'' \setminus (B \setminus \{x\}) \subseteq ((B \cup C) \setminus \{x\}) \setminus (B \setminus \{x\}) \subseteq C \setminus \{x\}\),所以 \(\exists \ y \in C \setminus \{x\}\) 是的 \(B \setminus \{x\} \cup \{y\} \in \mathcal B\)

因為 \(C\) 是一個圈並且 \(x, y \in C\),我們有 \(B' \setminus \{y\} \cup \{x\} \in \mathcal B\)\(\square\)

1.6 獨立性諭示 Independence Oracle

你可以把他理解為一個可以回答一個子集是否獨立的結構。擬陣交演算法的複雜度和 Independence Oracle 詢問的複雜度相關。

Part 2. 常見擬陣

下面列舉了一些常見的擬陣,但是遠不止這些。我們有時候需要根據題目要求構造擬陣。

2.1 均勻擬陣 Uniform Matroid

\(S\) 獨立當且僅當 \(|S| \le k\) 的擬陣被稱為均勻擬陣。容易證明這是一個擬陣。

所有大小為 \(k\) 的子集都屬於基,所有大小為 \(k+1\) 的子集都是圈。

Trivial Matroid 對應 \(k=0\) 的情況,Complete Matroid 對應 \(k=|X|\)

2.2 線性擬陣 Linear (algebra) Matroid

\(X\) 包含了一些向量。如果 \(S\) 獨立當且僅當 \(S\) 線性獨立。(即:不存在一個向量能夠表示為其他向量的線性組合)其符合擬陣的三條性質,讀者自證不難。(蛤?你不會證?2.4 和 2.5 寫了兩個證明示例)

向量的線性基就是線性擬陣的基。線性擬陣的圈滿足任意向量可以表示為其他向量的線性組合。

回答線性擬陣的 Oracle 詢問可以用高斯消元。

2.3 有色擬陣 Colourful Matroid

有色擬陣的 ground set 裡面的元素都上色了,每一個元素都上了一種顏色。

如果子集中的元素的顏色各不相同,則子集有獨立性。不難發現,在有色擬陣中,秩函式即為顏色數。

2.4 圖擬陣 Graphic Matroid

圖擬陣的 ground set 是無向圖的所有邊,而一個子集 \(S\) 獨立當且僅當 \(S\) 中的邊不形成環。

基是所有的生成樹,圈是圖中的所有簡單環。可以用並查集回答 Oracle 詢問。

圖擬陣的 ground set 顯然為有窮集,並且遺傳性也是顯然的;我們只需證明交換性質。

注意到圖中的一個含有 \(k\) 條邊的森林含有 \(n-k\) 個聯通塊,所以若 \(|B| > |A|\)\(A\) 森林的樹的數量一定比 \(B\) 多。不難發現,\(B\) 一定有一顆樹 \(T\) 的節點在 \(A\) 中對應了兩棵樹。因為 \(T\) 是聯通的,所以必定存在一條邊是連線 \(A\) 中兩棵樹的節點的。故將這條邊加到 \(A\) 中不會破壞獨立性。\(\square\)

2.5 劃分擬陣 Partition Matroid

\(X_1, X_2, \ldots, X_m\)\(X\) 的一個劃分,相應有 \(m\) 個非負整數 \(d_1, d_2, \ldots, d_m\)\(X\) 的子集 \(S\) 具有獨立性當且僅當 \(\forall i \in [1, m]\)\(|S \cap X_i| \leq d_i\)

劃分擬陣的 ground set 顯然為有窮集,並且遺傳性也是顯然的;我們只需證明交換性質。

\(A, B \in \mathcal I\)\(|B| > |A|\)。我們有 \(|A| = \sum |A \cap X_i|<\sum |B \cap X_i| = |B|\),所以至少存在一個 \(i\) 使得 \(|A \cap X_i| < |B \cap X_i| \leq d_i\),故我們將 \((B \cap X_i) \setminus A\) 中的任意一個元素加入到 \(A\) 中至多使 \(|A \cap X_i| \le d_i\),能夠保持獨立性。\(\square\)

2.6 截斷擬陣 Truncated Matroid

我們可以在不破壞擬陣性質的前提下對擬陣的秩進行一定的限制。

比如限制有色擬陣:限制其基為至多 \(k\) 種顏色。限制圖擬陣:基選出的邊使得圖中至少有 \(n-k\) 個聯通塊。

當所有大小大於等於 \(k\) 的獨立集都被移除,擬陣的性質顯然不會被破壞。

2.7 部分擬陣 Matroid on a subset of ground set

我們可以直接把 ground set 變成原本的一個子集,並且對 family of sets 做出一些相應的修改,這樣不會破壞擬陣的性質。這是因為獨立性和原本 ground set 中含有哪些元素無關。

我們也可以說對於 \(X' \subseteq X\)\(r(X')\) 同時也是擬陣 \(\mathcal M' = \langle X', \mathcal I' \rangle\) 的秩。

2.8 擬陣的和 Expanded Matroid & Direct Matroid Sum

如果兩個擬陣的 ground set 裡面的元素不影響彼此的獨立性,那麼我們可以簡單的把兩個擬陣合併起來。

即:\(\mathcal M_1 = \langle X_1, \mathcal I_1 \rangle\)\(\mathcal M_2 = \langle X_2, \mathcal I_2 \rangle\)\(\mathcal M_1 + \mathcal M_2 = \langle X_1 \cup X_2, \mathcal I_1 \times \mathcal I_2 \rangle\)。這裡的 \(\times\) 是笛卡爾積。

Part 3. Rado-Edmonds 演算法

Rado-Edmonds 演算法可以找到擬陣的基。

3.1 不帶權的情況

根據擬陣的第三條性質,我們可以往一個初始為空的集合中不斷加入元素,每次掃描 ground set。則我們有一個 \(\mathcal O(rn)\) 次 Oracle 詢問的演算法,其中 \(r\) 為擬陣的秩,\(n = |X|\)

但是我們注意到如果在某一個時刻某一個元素不能加入當前集合,則在未來的任意一個時刻也不會加入。所以每次不必掃描整個 ground set,只要在整個過程中掃描一遍就好了,所以我們就有了一個 \(\mathcal O(n)\) 次 Oracle 詢問的演算法。

3.2 帶權的一般情況 & 重溫 Kruskal 演算法

但是如果 ground set 中的元素帶權,我們就要找到一個權值之和最小的最大獨立子集。

如果是圖擬陣就變成了最小生成樹問題,那麼我們可以考慮使用類似的貪心演算法解決該問題。

回憶一下 Kruskal 演算法的過程:我們嘗試從大小為 \(k\) 的最小權值最大獨立集(記為 \(A\))轉移到大小為 \(k+1\) 的(記為 \(B\))。

根據擬陣的第三條性質,我們可以至少往 \(A\) 中加入一個 \(B\) 中的元素。記這個元素為 \(y\),則我們有 \(A \leq B \setminus \{y\}\) 以及 \(B \le A \cup \{y\}\)

如果我們往兩邊的柿子中同時加入 \(y\) 可得 \(A \cup \{y\} \le (B \setminus \{y\}) \cup \{y\}\) 以及 \(A \cup \{y\} \le B\)

所以 \(B \le A \cup \{y\} \le B \implies B = A \cup \{y\}\)

所以我們每次在不破壞獨立性的前提下加入權值最小的元素就能求出最小權值最大獨立集。

所以你又重溫了 Kruskal 演算法並且知道了如何用這個向普及組小朋友裝逼我們就有了一個 \(\mathcal O(n \log n)\) 排序以及 \(\mathcal O(n)\) 次 Oracle 詢問的演算法了。

3.3 擬陣和貪心的關係

由此我們看出,擬陣是證明貪心策略的重要方法。(但是不是所有貪心策略都一定能用擬陣證明)

這一部分內容在一篇洛穀日報 擬陣與最優化問題 中也有提到,但是不完全一樣。

Part 4. 擬陣交

4.1 功能

有兩個擬陣 \(\mathcal M_1 = \langle X, \mathcal I_1\rangle\)\(\mathcal M_2 = \langle X, \mathcal I_2 \rangle\)。我們要求出最大的 \(\mathcal I_1 \cap \mathcal I_2\) 的集合,即在 \(\mathcal M_1\)\(\mathcal M_2\) 中都有獨立性的最大集合。

4.2 例子

4.2.1 上色圖生成樹問題

有一張無向圖,每條邊有一個顏色。你需要找到一個生成樹使得生成樹中每一種顏色的邊不超過一條。

顯然,這是有色擬陣和圖擬陣的交。

4.2.2 染色線性向量問題

給定一些向量,每個向量都染色了,你需要找到最大的集合使得沒有相同顏色的向量,且集合中的向量線性無關。

顯然,這是有色擬陣和線性擬陣的交。

4.2.3 二分圖匹配

這是一個經典的問題。

警告:不要用擬陣交來做二分圖匹配,因為時間複雜度為 \(\mathcal O(|E|^3)\),大部分 OJ 上面的模板題都無法通過!

二分圖匹配其實就是“沒有兩條選出邊共用一個頂點”,我們將其簡化成為“沒有兩條選出的邊共用一個在右邊的頂點”。

右邊的擬陣可以用一個劃分擬陣來表示,左邊的擬陣也是相似的情況。即:

\[\mathcal M_1 = \langle E, \mathcal I_1 = \{F:|F \cap \operatorname{adj}_v| \le 1, v \text{ is in the right part}\}\rangle \\ \mathcal M_2= \langle E, \mathcal I_2= \{F:|F \cap \operatorname{adj}_v| \le 1, v \text{ is in the left part}\}\rangle \]

算出兩個擬陣的交就可以了。

4.2.3 哈密爾頓迴路問題

多個擬陣的交的例子:哈密爾頓迴路問題。

在有向圖上面,構造以下三個擬陣:

  1. 確保每個點出度至多 \(1\)(具體的,用一個有色擬陣,每個頂點連出的邊都是同一個顏色)
  2. 確保每個點入度至多 \(1\)(具體的,用一個有色擬陣,連入每個頂點的邊都是同一個顏色)
  3. 確保無環(具體的,忽略邊的方向,構造圖擬陣)

求出這三個擬陣的交就能解決問題啦!

所以……你覺得多個擬陣的交有多項式時間複雜度的演算法嗎?沒有!

4.2.4 其他題目

演算法競賽中還有一些其他的擬陣交的題,我放在 Part 7 例題裡面啦~

4.3 演算法

4.3.1 交換圖 Exchange Graph

首先我們考慮如何求出一個公共的極大獨立子集。

根據 1.5 Strong Basis Exchange Lemma,我們可以交換基的元素。同時,根據截斷擬陣的定義,我們可以把同一個大小的獨立集看作是一個新擬陣的基。所以,我們可以交換等大獨立集中的元素。

那麼我們如何描述這些交換關係呢?

考慮使用一張交換圖來表示這種關係。對於獨立集 \(S\),交換圖 \(\mathcal D(S)\) 是一個二分圖,如果我們能把 \(x\) 換成 \(y\) 而可以保持獨立性,則我們連 \((x,y)\) 這條邊。形式化的,如果 \(x \in S, y \in X \setminus S, S \setminus \{x\} \cup \{y\} \in \mathcal I\),則 \((x, y) \in E\)。也就是說,在交換圖上的一條邊的意義是交換某一個元素。

如圖 1 所示的無向圖,\(S = \{1, 2, 5\}\) 對應的交換圖如圖 2。

那麼交換圖有什麼用呢?

Lemma 4.3.2

如果這個引理的證明看不懂可以嘗試從交換圖的意義出發感性理解。

【引理】兩個獨立集 \(S,T\) 滿足 \(|S|=|T|\),則在 \(\mathcal D(S)\) 中一定存在 \(S \setminus T\)\(T \setminus S\) 間的完美匹配。

Proof. 定義截斷擬陣 \(\mathcal M' = \langle X, \{I' \in \mathcal I | |I'| \le |S|\}\rangle\),使 \(S, T \in \mathcal B'\)

\(x \in T \setminus S\),則根據 Strong Basis Exchange Lemma 我們有 \(\exists\ y \in S \setminus T\) 使得 \(S \setminus \{y\} \cup \{x\} \in \mathcal B'\) 並且 \(T \setminus \{x\} \cup \{y\}\in \mathcal B'\)

基中的元素一定都是獨立集,所以我們可以得出 \((y,x)\) 一定是 \(\mathcal D(S)\) 中的一條邊。

然後我們可以將 \(T\) 替換為 \(T \setminus \{x\} \cup \{y\}\)。不難發現 \(S \setminus T\)\(S \setminus (T \setminus \{x\} \cup \{y\})\) 多一個元素。

不難歸納得我們一定可以得到一個完美匹配。\(\square\)

Lemma 4.3.3

上面的引理的逆命題顯然是不成立的。我們可以隨意選擇兩條邊 \((a,b)\)\((c,d)\),這是不能保證成立的。如果 \(b\)\(d\) 在一起不獨立那就顯然不行了。

如圖中,原來的 \(S = \{(1,2), (2,3), (3,5), (5,6)\}\)。如果我們把 \((1,2)\) 換成 \((2,4)\),把 \((5,6)\) 換成 \((4,5)\),這兩個操作單獨做都沒有問題,但是如果同時做就破壞獨立性了。

那麼我們如何判斷這個匹配是否會破壞獨立性呢?

事實上,我們注意到一個圈有多種方法可以通過若干次交換變成一個獨立集。比如上述例子中可以把 \((5,6)\) 換成 \((2,3)\),把 \((1,2)\) 換到 \((3,5)\),也能得到同樣的圈。

那麼是不是隻有一個匹配就不會破壞獨立性呢?請看證明。

【引理】獨立集 \(S\) 和集合 \(T\) 滿足 \(|S|=|T|\),若在 \(\mathcal D(S)\) 中存在 \(S \setminus T\)\(T \setminus S\) 間的唯一匹配,則 \(T\) 具有獨立性。

Proof. 令唯一匹配為 \(N\)。給 \(\mathcal D(S)\) 中的邊標向,\(N\) 中的邊從 \(X \setminus S\)\(S\),不在 \(N\) 中的邊從 \(S\)\(X \setminus S\)。由於匹配唯一,所以現在 \(\mathcal D(S)\) 是一個 DAG。

我們對其拓撲排序,並且使得所有的邊從編號小的節點指向編號大的節點。

\(N = \{(y_1, x_1), (y_2, x_2), \ldots, (y_t, x_t)\}\),對於 \(i<j\)\((y_i, x_j)\) 肯定不在 \(N\) 中。

假設 \(T\) 不獨立,則 \(T\) 包含了一個圈 \(C\)。顯然,\(C\) 中至少包含一個 \(T \setminus S\) 的元素,因為 \(C \subseteq T\) 並且 \(S \in \mathcal I\)

因為對於 \(x \in C \setminus \{x_i \}\)\((y_i, x)\) 不在 DAG 中,所以 \(x \in \operatorname{span}(S \setminus \{y_i\})\)。所以 \(C \setminus \{x_i\} \subseteq \operatorname{span}(S \setminus \{y_i\})\)

所以 \(\operatorname{span}(C \setminus \{x_i\}) \subseteq \operatorname{span}(\operatorname{span}(S \setminus \{y_i\})) = \operatorname{span}(S \setminus \{y_i\})\)

由於 \(C\) 是一個圈,\(x_i \in \operatorname{span}(C \setminus \{x_i\}) \implies x_i \in \operatorname{span}(S \setminus \{y_i\})\)

因為 \((x_i, y_i) \in \mathcal D(S)\),所以矛盾。所以 \(T\) 一定獨立。\(\square\)


蛤?你不太理解?通俗的講一講。

我們嘗試構造一個圈使得某個獨立集到他只有一種匹配。

首先,顯然的是圈裡面至少要有兩個空位才能匹配到即 \(|C \setminus S| \geq 2\)。(如果交換了連線 \(C\) 的兩個元素的一條邊,那麼就沒法到 \(C\) 了,刪掉的邊不能添回來)如果只有一個空位,那麼交換圖中一定不存在換到這個空位的邊,因為如果換過來那麼單次操作就會破壞獨立性,和交換圖的定義矛盾。

我們想要把兩邊這兩條邊對應換到中間的圈中,但是我們要限制他使得左邊的邊不能換到右邊的空當中,右邊的邊不能換到左邊的空當中。注意到只有交換圖裡面存在的東西才能交換,所以我們只能在兩邊構造兩個圈。如圖

但是我們突然發現,為什麼實線描出來的東西(即原來的獨立集)不是獨立集,是一個圈!!1

咍咍,這是因為線上性組合的意義下某一個元素 \(x\) 和某個包含 \(x\) 的圈去除 \(x\) 之後是一樣的。(這是圈的名字的由來)

矛盾了,所以不存在這種構造。原命題成立。

讀到這裡,你可能要說:這個和擬陣交有什麼關係?

4.3.4 交換圖與增廣路 Augumenting Paths

接下來把前面的內容和擬陣的交聯絡上。

對於 \(I \in \mathcal I_1 \cap \mathcal I_2\),我們定義交換圖 \(\mathcal D_{\mathcal M_1, \mathcal M_2}(I)\) 是一個有向二分圖,左右邊分別為 \(I\)\(X \setminus I\)。邊 \((y,x)\) 在圖中當且僅當 \(I \setminus \{y\} \cup \{x\} \in \mathcal I_1\);邊 \((x,y)\) 在圖中當且僅當 \(I \setminus \{y\} \cup \{x\} \in \mathcal I_2\)。相當於合併了兩個在單一擬陣上的交換圖。

我們舉一個例子來說明。考慮例 1 的一個簡單的例子。圖長這樣,只有中間一條邊是紅色,其餘為黑色。

\(I = \{(1,2),(2,3),(3,4)\}\)\(\mathcal D_{\mathcal M_1}(S)\)\(\mathcal D_{\mathcal M_2}(S)\) 分別如左和右圖所示。

\(\mathcal D_{\mathcal M_1, \mathcal M_2}\) 如下圖所示。(邊的方向可能不是很清楚,黑色的都是左到右,紅色的都是右到左)

這張圖中只有兩個獨立集:\(I = \{(1,2),(2,3),(3,4)\}\)\(J = \{(1,3), (2,3), (2,4)\}\)。可以看到,\(I \setminus J = \{(1,2), (3,4)\}\)\(J \setminus I = \{(1,3), (2,4)\}\) 之間存在一個完美匹配。

那為什麼要給這張圖示上方向呢?別急,我們重新畫一下圖。

我們可以發現,這樣標向可以使得環中總是左邊和右邊的點交錯的模式。所有環一定都是偶環。

我們定義 \(X_1 = \{x \notin I | I \cup \{x\} \in \mathcal I_1\}\)\(X_2 = \{x \notin I | I \cup \{x\} \in \mathcal I_2\}\)

顯然,\(X_1\) 中的任意一個元素可以通過某條路徑到達 \(X_2\) 中的任意一個元素。

首先我們可以考慮幾個特殊情況。

  1. 如果 \(X_1 \cap X_2\) 非空,則我們顯然可以直接把這個元素加到 \(I\) 中去,然後進行剩下操作。
  2. 如果 \(X_1\) 或者 \(X_2\) 為空集,則此時 \(I\) 已經是一個基了(如果 \(I\) 不是基,我們一定可以找到至少一個元素插入 \(I\)),也就是說我們求出了擬陣交。

那麼我們如何滿足只存在一個完美匹配呢?如果我們找到一條可以“抄近道”的路,那麼這條路一定不行。

我們稱不能“抄近道”的路為增廣路。不能抄近道即不存在從路徑某一點之前的某一點直接連到之後那個點的邊。

但是由於 \(X_1\)\(X_2\) 都在右半邊,所以如果直接對原圖求增廣路,增廣路的長度將會是奇數。所以右邊將會有一個節點匹配不到。

我們為了解決這個問題,在交換圖中增加一個不影響最終答案的臨時節點(即:與其他所有點都獨立的節點)。記這個節點為 \(t\)。我們把 \(t\) 連線到 \(X_1\)\(X_2\) 中的元素上去。然後這個問題就解決了。

所以我們直接進行選出的增廣路中的邊所對應的交換操作,在這一步中我們可以忽略臨時節點 \(t\)。所以我們每找到一條增廣路我們就能夠把 \(I\) 的大小增加 \(1\)。形式化的,\(P\) 是增廣路上面除了 \(t\) 的節點集合,則每次操作我們都將 \(I\) 替換為 \((I \setminus P) \cup (P \setminus I)\)

4.3.5 Edmonds-Lawler theorem (Min-max Formula)

但是這樣一定可以找到擬陣交嗎?我們發現,如果增廣路不存在,\(X_1\)\(X_2\) 為空不一定滿足。

對於集合 \(U\),我們把 \(X\) 分成兩個部分 \(U\)\(X \setminus U\),則顯然 \(S\) 在某一個部分中的部分一定對兩個擬陣都具有獨立性。

我們可以用秩函式列四個不等式:

\[\begin{cases} |I \cap U| \le r_1(U) \\ |I \cap U| \le r_2(U) \\ |I \cap (X \setminus U)| \le r_1(X \setminus U) \\ |I \cap (X \setminus U)| \le r_2(X \setminus U) \end{cases} \]

\((1) + (4)\)\(|I \cap U| + |I \cap (X \setminus U)| \le r_1(U) + r_2(X \setminus U) \implies |I| \le r_1(U) + r_2(X \setminus U)\)

所以我們可以得出

\[\max _{I \in \mathcal I_1 \cap \mathcal I_2} |I| \le \min_{U \subseteq X} (r_1(U)+r_2(X \setminus U)) \]

【定理】當找不到增廣路的時候,我們記集合 \(U\) 表示 \(\mathcal D_{\mathcal M_1, \mathcal M_2}(I)\) 中可以到達 \(X_2\) 中某個點的點之集合,則

\[\max _{I \in \mathcal I_1 \cap \mathcal I_2} |I| = r_1(U)+r_2(X \setminus U) \]

Proof. 顯然 \(X_2 \subseteq U\),並且 \(X_1 \cap U = \varnothing\)。否則我們就可以找到一條增廣路。我們需要證明 \(r_1(U) = |I \cap U|\)\(r_2(X \setminus U) = |I \cap (X \setminus U)|\)

假設 \(r_1(U) \neq |I \cap U|\)。因為 \(I \cap U\) 獨立,並且 \(I \cap U \subseteq U\),所以 \(|I \cap U| < r_1(U)\)

則需要存在 \(x \in U \setminus I\) 滿足 \(U \cap I \cup \{x\} \in \mathcal I_1\)

因為已經找不到增廣路了,所以 \(I \cup \{x\}\) 要麼不獨立,要麼恰好含有一個環。這個環至少包含一個不在 \(U \cap I \cup \{x\}\) 中的元素。

無論是那種情況都存在 \(y \in I \setminus U\) 使得 \(I \setminus \{y\} \cup \{x\} \in \mathcal I_1\)

但是如果這樣 \((y,x)\) 這條邊存在於 \(\mathcal D_{\mathcal M_1, \mathcal M_2}(I)\) 中,所以 \(x \in U \implies y \in U\)。矛盾。

所以 \(r_1(U) = |I \cap U|\)

同理可得 \(r_2(X \setminus U) = |I \cap (X \setminus U)|\)

所以 \(\max |I| = r_1(U) + r_2(X \setminus U)\)\(\square\)

所以演算法的正確性證明完了。再總結一下演算法流程:

重複執行下列步驟:

  1. 建交換圖
  2. 算出 \(X_1\)\(X_2\)
  3. 找增廣路,找不到就退出
  4. 更新當前 \(I\)

4.4 複雜度

\(r = \max(r_1(X), r_2(X))\)

我們可以用 \(\mathcal O(rn)\) 次 Oracle 詢問建出交換圖,\(\mathcal O(n)\) 次詢問找到 \(X_1\)\(X_2\),並且找到增廣路的時間複雜度為 \(\mathcal O(rn)\)

因為我們需要增廣至多 \(r\) 次,所以演算法的時間複雜度為 \(\mathcal O(r^2n)\) 次 Oracle 詢問。大多數情況下使用這個演算法就足夠了。

4.5 優化

4.5.1 一般情況的優化

我們可以看到複雜度的瓶頸其實是建交換圖這一步,所以我們乾脆跳過這一步,在找增廣路的時候同時進行建圖。

每次找最短的增廣路(並且使用更快的尋找增廣路的演算法(?)),就可以做到 \(\mathcal O(r^{1.5}n)\) 次 Oracle 詢問了。

前兩句話可能講的比較模糊,同學們可以看這篇論文:William H. Cunningham. Improved Bounds for Matroid Partition and Intersection Algorithms.[J]. SIAM J. Comput.,1986,15(4)

(順便說一句,如果有同學能看這篇論文私信我)

4.5.2 針對有色擬陣的 Oracle 詢問優化

這個應該比較容易吧……

直接維護一個儲存每個顏色的數量的陣列即可(通過增刪操作實現)。每次增刪和 Oracle 詢問都容易做到 \(\mathcal O(1)\)

4.5.3 針對圖擬陣的 Oracle 詢問優化

針對圖擬陣,我們有兩種回答 Oracle 詢問的方式:

  1. 我們可以執行 \(r\) 次去掉一條邊,數聯通快這一操作。如果邊連線了兩個不同的聯通快,則我們可以使用這條邊。所以我們每次建立交換圖是 \(\mathcal O(n)\)。但是空間複雜度是 \(\mathcal O(rn)\),如果出題人故意卡,就……
  2. 考慮我們可以換某條邊的條件是這條邊連線了兩棵樹(否則就會有環)。然後可以轉化成 LCA 問題求解。(不推薦使用)

4.5.4 針對線性擬陣的 Oracle 詢問優化

比較樸素的想法是用高斯消元法,時間複雜度 \(\mathcal O(r^2m)\)。如果向量空間是 \(\mathbb Z _2^m\),那麼我們可以用 bitset 優化到 \(\mathcal O(\frac {r^2m} w)\)

考慮優化,如果我有向量集合的基,我們就可以做到做到 \(\mathcal O(rm)\),因為我們只需要消去一個向量。

因為高斯消元之後我們不容易移除一個原有向量,所以我們對於每個可能被刪去的向量預處理該向量刪去之後的基。

預處理 \(\mathcal O(r^3m)\),每條邊 \(\mathcal O(rm)\)

4.6 帶權擬陣交 Weighted Matroid Intersection

每個元素都帶有一個權值 \(w_x\) 的情況下,如何求出權值之和最大的交呢?我們定義極限獨立集為大小最大的獨立集中權值最大的獨立集。很顯然,我們要求的就是極限獨立集。

其實做法和前面是一樣的,但是我們要對交換圖做一些改動:如果 \(x \in I\)\(x\) 的權值為 \(w_x\),否則為 \(-w_x\)

我們每次找到最短的增廣路,第一關鍵字為長度(交換圖上的權值之和),第二關鍵字為路徑的邊數。

因為有負權,所以我們必須使用 Bellman-Ford 演算法解決。

PS. 如果使用佇列優化的 Bellman-Ford 演算法將會改善演算法的常數,並且在大多數圖中都取得不錯的執行效率。

Min-Max 方程有一個帶權的版本:

\[\max _{I \in \mathcal I_1 \cap \mathcal I_2} \sum _{e \in I} w(e) = \min _{\forall x, w_1(x)+w_2(x)=w(x)} \left(\max _{I \in \mathcal I_1} w_1(I)\right) + \left(\max _{I \in \mathcal I_2} w_2(I)\right) \]

Part 5. 擬陣並

如果下文中的證明你看不懂,那麼只看結論也是沒有關係的。

5.1 對偶擬陣 Dual Matroid

5.1.1 對偶擬陣

【定義】對於任何擬陣 \(\mathcal M = \langle X, \mathcal I \rangle\),我們定義其對偶擬陣為 \(\mathcal M^* = \langle X, \mathcal I^*\rangle\),其中 \(\mathcal I^* = \{S \subseteq X | \exists B \in \mathcal B, B \subseteq X \setminus S\}\)

感興趣的讀者可以自己證明 \(\mathcal M^*\) 是一個擬陣。

Lemma 5.1.2

【引理】\(\mathcal M^*\) 的秩函式是 \(r_{\mathcal M^*}(S) = |S| + r_\mathcal M (X \setminus S) - r_\mathcal M(X)\)

Proof. 顯然,\(r_{\mathcal M^*}(S) = \max _{I \subseteq S, I \in \mathcal I^*} |I| = |S| - \min _{B \in \mathcal B_{\mathcal M}}|S \cap B|= |S| + r_\mathcal M(X \setminus S) - r_\mathcal M(X)\)

秩函式的第一條性質是顯然滿足的。

假設 \(T \subseteq S \subseteq X\)。則 根據 \(r_\mathcal M(\cdot)\)(下面簡寫為 \(r(\cdot)\))的次模性

\[r_{\mathcal M^*}(T) = |T| - r(X)+r(X \setminus T) \le |T| - r(X) + [r(X \setminus S) + r(S \setminus T) \\ \leq |T| - r(X)+r(X \setminus S)+(|S|-|T|) = |S| - r(X)+r(X \setminus S) = r_{\mathcal M^*}(S) \]

所以 \(r_{\mathcal M^*}\) 具有單調性。

\(I,J \subseteq X\)\(T = X \setminus I\)\(S = X \setminus J\)

根據 \(r(\cdot)\) 的次模性,我們有 \(r(T \cup S) + r(T \cap S) = r(X \setminus (I \cap J))+r(X \setminus(I \cup J)) \leq r(X \setminus I) + r(X \setminus J)\)。所以 \(|I \cap J| + |I \cup J| = (|I| + |J| - |I \cap J|) + |I \cap J| = |I| + |J|\)。所以 \(r_{\mathcal M^*}(I \cup J) + r_{\mathcal M^*}(I \cap J) \leq r_{\mathcal M^*}(I) + r_{\mathcal M^*}(J)\)

所以 \(r_{\mathcal M^*}\) 具有次模性。\(\square\)

5.1.2 圖擬陣對偶的性質

其實對偶擬陣有一些有趣的性質,不妨展開講一講。

一個圖擬陣的對偶擬陣的意義是從圖中刪去一些邊,但是圖仍然聯通。

一個圖擬陣的對偶擬陣是一個圖擬陣當且僅當原來的圖是平面圖,而且對偶擬陣對應的圖對應的是平面圖的任一平面對偶圖。

對這個命題感興趣的同學請閱讀論文 W. T. Tutte.(1959).Matroids and graphs. tran(3), doi:10.1090/S0002-9947-1959-0101527-3.

5.2 擬陣並

5.2.1 擬陣並

我們有 \(k\) 個擬陣為 \(\mathcal M_i = \langle X_i, \mathcal I_i\rangle\)

定義 \(X = \bigcup _{i=1}^k X_i\)\(\mathcal I = \left \{\bigcup _{i=1}^k S_i | S_i \in \mathcal I_i\right \}\)。(比如:\(k=2\) 時,\(\mathcal I = \{S_1 \cup S_2 | S_1 \in \mathcal I_1, S_2 \in \mathcal I_2\}\)

Lemma 5.2.2

【定義】擬陣並 \(\mathcal M_1 \lor \mathcal M_2 \lor \ldots \lor \mathcal M_k = \langle X, \mathcal I \rangle\)

【引理】\(\mathcal M = \mathcal M_1 \lor \mathcal M_2 \lor \ldots \lor \mathcal M_k\) 的秩函式為

\[r_\mathcal M(S) = \min _{T \subseteq S} \left[|S \setminus T| + \sum _{i=1} ^k r_{\mathcal M_i}(T \cap X_i)\right] \]

Proof.

【引理 A】\(\hat {\mathcal M} = \langle \hat{X}, \hat{\mathcal I}\rangle\) 是一個擬陣,且 \(\hat{\mathcal M} = \hat{\mathcal M_1} \lor \hat{\mathcal M_2} \lor \ldots \lor \hat{\mathcal M_k}\),其中 \(\hat{\mathcal M_i} = \langle \hat {X_i}, \hat {\mathcal I_i}\rangle\),且對於任意 \(i \neq j\)\(X_i \cap X_j = \varnothing\)。則對於任何 \(f:\hat X \mapsto X\)\(\langle X, \mathcal I \rangle\) 是一個擬陣,其中 \(\mathcal I = \{f(\hat I) | \hat I \in \hat{\mathcal I}\}\)。並且其秩函式是 \(r_\mathcal M(S) = \min _{T \subseteq S} [r_{\hat{\mathcal M}}(f^{-1}(T))+|S \setminus T|]\)

Proof. 首先,\(X\) 是有窮集是顯然的。

\(I \in \mathcal I\),則一定存在 \(\hat I \in \hat {\mathcal I}\) 使得 \(|I| = |\hat I|\) 並且 \(I = f(\hat I)\)\(I\) 的任一子集一定可以表示為 \(f(\mathcal{\hat I}\) 的某個子集\()\)。所以 \(\langle X, \mathcal I \rangle\) 滿足擬陣的遺傳性。

\(J \in \mathcal I\)\(J = f(\hat J)\)\(\hat J \in \mathcal {\hat I}\)\(|J| = |\hat J| > |I|\),則存在 \(e \in \hat J \setminus \hat I\) 使得 \(\hat I \cup \{e\} \in \hat{\mathcal I}\)\((1)\)

我們進一步假設 \(\hat I = \arg \max _{\hat I} |\hat I \cap \hat J|\)(在使得 \(|I| = |\hat I|\) 並且 \(I = f(\hat I)\)\(\hat I\) 中選擇)。

然後假設 \(f(e) \in I \cap J\),則 \(\exists e' \in \hat I \setminus \hat J\) 使得 \(f(e')=f(e)\)

\(\hat I' = \hat (I \setminus \{e'\}) \cup \{e\}\),根據 \((1)\) 式可得 \(\hat I' \in \hat{\mathcal I}\),並且 \(f(\hat I')=I\)

但是 \(|\hat I' \cap \hat J| = |\hat I \cap \hat J| + 1\),所以和 \(\hat I = \arg \max _{\hat I} |\hat I \cap \hat J|\) 矛盾。

所以 \(f(e) \notin I\)。所以存在 \(z \in J \setminus I\),也就是說 \(z = f(e)\) 使得 \(I + z \in \mathcal I\)。所以 \(\langle X, \mathcal I \rangle\) 滿足擬陣的交換性質。

接下來來證明這個秩函式。

令關於 \(S\) 的劃分擬陣 \(\mathcal M' = \langle \hat X, \mathcal I_p \rangle\),其中 \(\mathcal I_p = \{I \subseteq \hat X : |f^{-1}(e) \cap I| \leq 1\ \forall e \in S, |f^{-1}(e) \cap I| = 0\ \forall e \notin S\}\)

顯然,其秩函式為 \(r_{\mathcal M'}(T) = |\{e \in S : f^{-1}(e) \cap T \neq \varnothing\}|\)

\(I\) 是一個獨立集當且僅當存在子集 \(\hat I \subseteq \hat S = f^{-1}(S)\)\(\mathcal M_p\)\(\mathcal M'\) 中均獨立。

所以 \(\max_{I \subseteq S, I \in \mathcal I} |I| = \max _{\hat I \subseteq \hat S, \hat I \in \hat {\mathcal I} \cap \mathcal I_p} |\hat I|\)

根據 Min-Max 方程我們有 \(r_\mathcal M(S) = \min _{\hat T \subseteq \hat S} \left [r_{\mathcal {\hat M}}(\hat T) + r_{\mathcal M_p}(\hat S \setminus \hat T) \right]\)

假設 \(\hat T = f^{-1}(T)\) 不是最優。定義 \(\hat T' = \hat S \setminus f^{-1}(f(\hat S \setminus \hat T)) = f^{-1}(S \setminus f(\hat S \setminus \hat T))\)。分類:

  1. \(\hat T' \subseteq \hat T\)\(r_{\mathcal{\hat M}}(\hat T') \leq r_{\mathcal {\hat M}}(\hat T)\),與 \(r_\mathcal M(S) = \min _{\hat T \subseteq \hat S} \left [r_{\mathcal {\hat M}}(\hat T) + r_{\mathcal M_p}(\hat S \setminus \hat T) \right]\) 矛盾。
  2. \(r_{\mathcal M_p}(\hat S \setminus \hat T') = r_{\mathcal M_p}(\hat S\setminus \hat T)\) 時,不劣於原方案,矛盾。
  3. \(\hat T' = f^{-1}(S \setminus f(\hat S \setminus \hat T))\) 時,不劣於原方案,矛盾。

所以 \(\hat T = f^{-1}(T)\) 一定是最優的。所以 \(r_\mathcal M(S) = \min _{T \subseteq S} \left[r_{\mathcal{\hat M}}(f^{-1}(T)) + |S \setminus T|\right]\)\(\square\)

接下來回到引理 5.2.2。如果 \(X_i\) 滿足不交,那麼根據引理 A,原命題顯然成立。

否則,我們通過以下步驟將其轉換為 \(X_i\) 不交的情況。

  1. 給集合中的元素標上擬陣的序號,使其不重複,構造擬陣 \(\hat{\mathcal M} = \langle \hat X_i, \mathcal I_i\rangle\)。方法:把 \(e \in X_i\) 變成二元組 \((i,e)\)
  2. 定義 \(f : \hat X \mapsto X\)\(f((i, e))=e\)

所以我們可以得到一個不會有元素重複的 \(\hat X\)

根據引理 A,我們有

\[\begin{aligned} r_{\mathcal M}(S) &= \min _{T \subseteq S} [r_{\mathcal{\hat M}}(f^{-1}(T))+|S \setminus T|] \\ &= \min _{T \subseteq S} \left[\sum _{i=1} ^k r_{\mathcal{\hat M}}(f^{-1}(T) \cap \hat X_i ) + |S \setminus T|\right] \end{aligned} \]

\(\square\)

5.2.3 驗證獨立性(擬陣交)

如何查詢擬陣並裡面一個集合是否獨立呢?

我們可以簡單地考慮我們在證明引理 A 的時候構造的劃分擬陣。只要我們能夠查詢 \(f^{-1}\),我們就可以使用擬陣交演算法求出這個劃分擬陣,然後在這個劃分擬陣中驗證這個集合的獨立性。

我們注意到這個劃分擬陣中的 Ground set 的大小是求並的所有擬陣的 Ground set 的大小之和,所以這個擬陣交的方法可能效率比較低。

5.2.4 驗證獨立性(擬陣劃分)

我們在上一個部分中已經提到了,使用擬陣交進行擬陣並中的集合獨立性驗證是比較低效的,所以我們在這個部分中嘗試給出一種比較高效的方法。

擬陣劃分的意思是對於一個擬陣並 \(\mathcal M = \mathcal M_1 \cup \mathcal M_2 \cup \ldots \cup \mathcal M_k\) 中的獨立集 \(I \in \mathcal I\)\(I\) 可以表示為劃分 \(I_1 \cup I_2 \cup \ldots \cup I_k\),其中 \(I_i \in \mathcal I_i\)。給定 \(s \notin I\),判斷 \(I \cup \{s\}\) 是否獨立。

我們可以用擬陣劃分很容易的判斷擬陣並中某一個集合是否獨立。

我們仍然考慮交換圖。每一個擬陣的交換圖 \(\mathcal D_i(I_i)\) 是一個二分圖,左邊是 \(I_i\),右邊是 \(X_i \setminus I_i\)。左邊的點 \(y\) 到右邊的點 \(x\) 有一條有向邊當且僅當 \(I_i \setminus \{y\} \cup \{x\} \in \mathcal I_i\)

然後我們還是仿照擬陣交的做法把這些交換圖合併,合併後的圖記為 \(\mathcal D\)

定義 \(F_i = \{x \in X_i \setminus I_i | I_i \cup \{x\} \in \mathcal I_i\}\),即可以加到 \(I_i\) 中不會破壞獨立性的元素的集合。

下面的定理會說明這麼做如何解決擬陣劃分問題。

Theoreom 5.2.5

\(\forall s \notin I\)\(I \cup \{s\} \in \mathcal I\) 當且僅當 \(\mathcal D\) 中存在一條從 \(F\)\(s\) 的路徑。

Proof. 先證明充分性(\(\Leftarrow\)):假設路徑為 \(P\),路徑 \(P\) 上的節點分別為 \(s_0, s_1, \ldots, s_p\)

因為 \(s_0 \in F\),所以我們不妨假設 \(s_0 \in F_1\)

我們令路徑 \(P\) 中屬於 \(\mathcal D_{\mathcal M_j}(I_j)\) 的邊的終點集合為 \(S_i\)

我們令 \(I_1' = (I_1 \triangle S_1) \cup \{s_0\}\)。 其中 \(\triangle\) 表示對稱差,即 \(A \triangle B = (A \setminus B) \cup (B \setminus A)\)。對於 \(j>1\),我們令 \(I_j' = I_j \triangle S_j\)

顯然, \(\bigcup I_j' = I \cup \{s\}\)。所以擬陣並中 \(I \cup \{s\}\) 獨立就等價於對於每個 \(j\)\(I_j' \in \mathcal I_j\)

我們假定 \(P\) 是最短路徑。(顯然,如果存在一條或多條路徑,那麼必然存在一條最短路徑)所以對於 \(j>1\)\(\mathcal D_{\mathcal M_j}(I_j)\) 中在刪除和加入的點之間存在一個唯一的完美匹配。(為什麼會刪除和加入?因為我們要把原來的變成 \(I_j'\)

所以 \(I_j' \in \mathcal I_j\)

同理,因為 \(s_0 \in F_1\),所以 \(I_1' \in \mathcal I_1\)。必要性證畢。

順便說一句,這個演算法是多項式時間複雜度的,他只需要執行 \(\sum _i (|I_i|)(|X_i| - |I_i|)\) 次 Oracle 詢問就可以了。

然後證明必要性(\(\Rightarrow\)):假設沒有這麼一條路徑。我們令 \(T\)\(\mathcal D\) 中可以到達 \(s\) 的節點的集合,則 \(F \cap T = \varnothing\)

對於所有 \(i\),我們有 \(|I_i \cap T| = r_i(X_i \cap T)\)。所以 \(I_i \cap T\)\(\mathcal M_i\)\(T\) 的最大子集。

假設存在矛盾。

因為 \(|I_i \cap T| = r_i(I_i \cap T) \le r_i(X_i \cap T)\),所以只能 \(|I_i \cap T| < r_i(X_i \cap T)\)

所以存在 \(x \in T \cap (X_i \setminus I_i)\) 使得 \((I_i \cap T) \cup \{x\} \in \mathcal I_i\)

但是 \(x \notin F\)(因為 \(x \in T\))所以 \(I_i \cup \{x\} \notin \mathcal I_i\)

因為 \(I_i \cup \{x\}\) 包含一個唯一的圈,所以一定存在 \(y \in I_i \setminus T\) 使得 \(I_i \setminus \{y\}\cup \{x\} \in \mathcal I_i\)

那麼 \((y,x)\) 這條邊一定在 \(\mathcal D_{\mathcal M_i}(I_i)\) 中,也就是說 \(y \in T\),與 \(y \in I_i \setminus T\) 矛盾。

所以對於所有的 \(i\) 我們有 \(|I_i \cap T| = r_i(T \cap X_i)\)

因為 \(s \in T\),我們有 \((I \cup \{s\}) \cap T = (\bigcup I_i \cup \{s\})\cap T = \bigcup(I_i \cap T) \cup \{s\}\)

然後我們根據兩個擬陣的交的秩函式,我們可以得到

\[\begin{aligned} r_\mathcal M(I \cup \{s\}) &\leq \left[|(I \cup \{s\} \setminus T| + \sum _{i=1} ^k r_i(T \cap X_i)\right] \\ &\leq |(I \cup \{s\}) \setminus T| + \sum _{i=1}^k |I_i \cap T| \\ &=|I \setminus T| + \sum _{i=1}^k |I_i \cap T| \\ &=|I| < |I \cup \{s\}| \end{aligned} \]

所以 \((I \cup \{s\}) \notin \mathcal I\),證畢。

\(\square\)

5.2.6 擬陣並的其他應用(再談擬陣的基)

5.2.6.1 基交換定理

\(\mathcal M = \langle X, \mathcal I \rangle\) 是一個任意擬陣,\(B_1, B_2 \in \mathcal B\),對於任意劃分 \(B_1 = X_1 \dot \cup Y_1\),存在劃分 \(B_2 = X_2 \dot \cup Y_2\) 使得 \(X_1 \cup Y_2 \in \mathcal B\) 並且 \(X_2 \cup Y_1 \in \mathcal B\)

Proof. 令 \(\mathcal M_1 = \mathcal M \setminus Y_1\)\(\mathcal M_2 = \mathcal M \setminus X_1\)

顯然,\(X_1 \in \mathcal I_1\)\(Y_1 \in \mathcal I_2\)。所以 \(B_1\)\(\mathcal M_1 \cup \mathcal M_2 = \langle X, \mathcal I_1 \cup \mathcal I_2 \rangle\) 中是獨立的。則我們只需要證明 \(B_2\) 獨立就行了,那樣我們就能劃分 \(B_2\)

我們只需要計算

\[r_{\mathcal M_1 \cup \mathcal M_2}(B_2) = \min _{U \subseteq B_2} [|B_2 \setminus U| + r_{\mathcal M_1}(U \setminus Y_1) + r_{\mathcal M_2}(U \setminus X_1)] \]

注意到,對於任意 \(A \subseteq X \setminus Y_1\),我們有 \(r_{\mathcal M_1}(A) = r_\mathcal M(A \cup Y_1) - r_\mathcal M(Y_1)\)。所以

\[r_{\mathcal M_1 \cup \mathcal M_2}(B_2) = \min _{U \subseteq B_2} [|B_2 \setminus U| + r_\mathcal M(U \cup Y_1) - r_\mathcal M(Y_1) + r_\mathcal M(U \cup X_1) - r_\mathcal M(X_1)] \]

我們在 \(r_\mathcal M(U \cup Y_1) + r_\mathcal M(U \cup X_1)\) 上面用一次次模性得

\[r_{\mathcal M_1 \cup \mathcal M_2}(B_2) \geq \min [|B_2 \setminus U| + r_\mathcal M(U \cup X_1 \cup Y_1) + r_\mathcal M(U) - |X_1| - |Y_1|] \]

因為 \(r_\mathcal M(U) = |U|\) 並且 \(r_\mathcal M(U \cup X_1 \cup Y_1) = |X_1| + |Y_1|\),所以我們可以得到

\[r_{\mathcal M_1 \cup \mathcal M_2} (B_2) \geq |B_2| \]

所以 \(r_{\mathcal M_1 \cup \mathcal M_2}(B_2) = |B_2|\),證畢。

\(\square\)

5.2.6.2 同一個擬陣的並

我們考慮 \(k\) 個一樣的擬陣的並。他的秩函式是

\[r_{\mathcal M^k}(U) = \min _{T \subseteq U} [|U \setminus T| + k \cdot r_\mathcal M(T)] \]

因為 \(r_{\mathcal M^k}(U)\) 僅僅是 \(U_1, U_2, \ldots, U_k \subseteq U\) 的並的最大大小,其中 \(U_i \in \mathcal I\),我們可以得到以下兩個結論。

5.2.6.3 擬陣基覆蓋 Matroid base covering

一個擬陣能被 \(k\) 個基覆蓋當且僅當 \(\forall T \subseteq X : |T| \leq k \cdot r_\mathcal M(T)\)

能被覆蓋等價於 \(r_{\mathcal M^k}(X) = |X|\)

5.2.6.4 擬陣基壓縮 Matroid base packing

這個翻譯不準確!如果有知道的同學聯絡我!

說句閒話,這個名字好奇怪啊,怎麼翻譯啊

一個擬陣包含 \(k\) 個不交的基當且僅當 \(\forall T \subseteq X : |X \setminus T| \geq k(r_\mathcal M(S) - r\mathcal M(T))\)

\(k\) 個不交的基等價於 \(r_{\mathcal M^k}(X) = k \cdot r_\mathcal M(X)\)

當擬陣是圖擬陣的時候會怎麼樣呢?

5.2.6.5 Nash-Williams 定理

一個圖 \(G\) 能被 \(k\) 個生成樹覆蓋當且僅當 \(\forall U \subseteq B : |E(U)| \leq k(|U| - 1)\)

5.2.6.6 Tutte 定理

定義 \(\delta(V_1, V_2, \ldots, V_p) = \{(u,v) \in X | u \in V_i, v \in V_j, i \ne j\}\)

一個圖 \(G\) 包含 \(k\) 個邊不交的生成樹當且僅當對於所有的 \(V\) 的劃分 \((V_1, V_2, \ldots, V_p)\)\(|\delta(V_1, \ldots, V_p)| \geq k(p - 1)\)

下一部分將圍繞這個結論展開。

Part 6. Shannon 開關遊戲

這是一個經典的問題,已經有人把他的一部分搬到演算法競賽中了,如果你想要在 OJ 上面提交這道題,他的題號是 UVA 12370。(遠古時期洛谷也有【模板】Shannon 開關遊戲,但是那個提後來撤掉了,可能是因為假掉了?)

6.1 問題描述

有一張無向圖和兩個點 \(u\)\(v\),兩個人 Cut 和 Join 在圖上玩遊戲,兩個人輪流操作。Cut 可以從 \(G\) 中刪除一條邊,而 Join 可以固定一條邊使 Cut 不能刪除這條邊。如果一條從 \(u\)\(v\) 的路徑中的邊都被固定了,則 Join 勝利。如果 Join 無法勝利,則 Cut 勝利。

因為這個遊戲中每一次操作都比不操作有利,所以肯定會有三種結果:

  • Join Game:無論誰先手都是 Join 勝利。
  • Cut Game:無論誰先手都是 Cut 勝利。
  • Neutural Game:誰先手誰勝利。

其實這個遊戲也可以在其他的擬陣上面做,Lehman 提供了這個問題的各種策略,見 A. Lehman, “A solution to Shannon’s switching game”,J. Soc. Indust. Appl. Math.,12, 687–725, 1964. 這篇論文。

他對於圖擬陣上的遊戲,在 \(u\)\(v\) 上面增加一條兩人都不能操作的邊 \(e\),令 \(X' = X \cup \{e\}\)

這樣在任何一種擬陣中,Join 想要在 \(\mathcal M\) 形成一個包含 \(e\) 的圈,Cut 想要在 \(\mathcal M^*\) 即對偶擬陣中形成一個包含 \(e\) 的圈。

Edmonds 考慮了這個問題的一個更加一般化的形式。對於擬陣 \(\mathcal M = \langle N \dot \cup K, \mathcal I\rangle\),兩個人在 \(N\) 上面進行遊戲。如果 Join 得到了一個集合 \(A \subseteq N\) 使得 \(\operatorname{span}(A) \supseteq K\),則 Join 勝利。

這個問題的一個特例是 \(K\) 的 span 包括整個 ground set。那麼此時 Join 就想要得到一個基。(這個特例對應了 5.2.3 中的特例)

當擬陣是一個圖擬陣的時候,Join 就想要得到一個生成樹。

6.2 特例下的 Shannon 開關遊戲

上述特例下,一個擬陣 \(\mathcal M = \langle X, \mathcal I \rangle\) 是一個 Join Game 當且僅當 \(\mathcal M\) 有兩個不交的基。

Proof. 先證 \(\Leftarrow\)。假設 \(M\) 包含兩個不交的基。我們現在要構造 Join 後手的必勝策略。

\(B_1\)\(B_2\)\(\mathcal M\) 中的不交的基。如果 Cut 刪除不在 \(B_1\) 或者 \(B_2\) 中的元素,那麼沒有一點問題。否則 Join 就要在 \(B_2\) 中找到一個 \(y\) 使得 \(B_1 \setminus \{x\} \cup \{y\} \in \mathcal B\)。(根據基交換定理)

接下來 Join 就要在 \(\mathcal M \setminus \{y\}\) 中找到一個基。顯然,\(B_1 \setminus \{x\}\)\(B_2 \setminus \{y\}\) 是新的擬陣中的不交的基。

歸納可得 Join 後手時也有必勝策略。先手時的必勝策略是顯然的。

然後證明 \(\Rightarrow\)

假設 \(\mathcal M\) 沒有兩個不交的基。我們現在要構造 Cut 先手時的必勝策略。

根據擬陣基壓縮定理,存在 \(T \subseteq X\) 使得 \(|X \setminus T| < 2(r_\mathcal M(X) - r_\mathcal M(T))\)。Cut 操作時 Cut 總是在 \(X \setminus T\) 中操作。因為 Cut 先手,所以 Cut 會刪除 \(X \setminus T\) 的至少一半。所以 Join 固定的所有元素的秩會嚴格小於 \(r_\mathcal M(T) + (r_\mathcal M(X) - r_\mathcal M(T)) = r_\mathcal M(X)\),即 Join 不能固定一個基。

\(\square\)

6.3 一般情況的 Shannon 開關遊戲

Theoreom 一個擬陣是一個 Join Game 當且僅當 \(\exists A,B \subseteq S\) 使得 \(A \cap B = \varnothing\),並且 \(e \in \operatorname{span}_\mathcal M(A) = \operatorname{span}_\mathcal M(B)\)

\(\Leftarrow\) 的證明應該不難,這個和特例下的情況差不多,這裡大概用通俗一點的話再說一下思路。Join 的必勝策略在於找到 \(A \cup B\) 中的元素或者 \(A\)\(B\) 中最大獨立子集中的元素(忽略其他的使得最大獨立子整合為基)。如果 Cut 刪掉了想要固定的邊 \(x\) 就再找一個 \(y\) 替上。根據基壓縮定理,替換之後的仍然是不交的基,所以我們可以直接歸納證明。\(\square\)

我們讓 Cut 在對偶擬陣上面玩。令 Cut 選擇的元素的集合為 \(\mathscr C\),Join 選擇的元素是 \(\mathscr J\)。那麼如果 Cut 滿足了 \(e \in \operatorname{span}_{\mathcal M^*}(\mathscr C)\) 他就贏了;如果 Join 滿足了 \(e \in \operatorname{span}_{\mathcal M}(\mathscr J)\) 他就贏了。


Lemma A\(C \in \mathcal C_\mathcal M\)\(D \in \mathcal C_{\mathcal M^*}\),則 \(|C \cap D| \neq 1\)

假設存在 \(C \in \mathcal C_\mathcal M\)\(D \in \mathcal C_{\mathcal M^*}\) 使得 \(|C \cap D| = 1\) 。令 \(C \cap D = \{e\}\)

因為 \(D \setminus \{e\} \in \mathcal I_{\mathcal M^*}\),所以 \(X' \setminus (D \setminus \{e\})\) 包含一個基。

因為 \(C \setminus \{e\} \subset X' \setminus (D \setminus \{e\})\),並且 \(C \setminus \{e\} \in \mathcal I_\mathcal M\),所以我們不難得到存在一個基 \(B\) 使得 \(C \setminus \{e\} \subset B \subset X' \setminus (D \setminus \{e\})\)

如果 \(e \in B\)\(C \subseteq B\),與 \(B\) 是一個基矛盾。

所以 \(C \setminus \{e\} \subseteq B \subseteq X' \setminus (D \setminus \{e\})\),即 \(D \subseteq X' \setminus B\)。所以 \(D\) 在對偶擬陣中就獨立了,矛盾。

所以 \(|D \cap C| \neq 1\)

\(\square\)


Lemma B 如果我們讓 Cut 在對偶擬陣上面玩,則正好有一個玩家能勝利。

Proof.

如果存在兩個人同時勝利的情況,則 \(\exists \mathscr J, \mathscr C \subset S\) 使得 \(\mathscr J \cap \mathscr C = \varnothing\)\(\mathscr J \cup \mathscr C = X\)\(e \in \operatorname{span}_\mathcal M(\mathscr J)\) 並且 \(e \in \operatorname{span}_{\mathcal M^*}(\mathscr C)\)。所以存在圈 \(C \subseteq \mathscr J \cup \{e\}\) 和對偶擬陣上的圈 \(D \subseteq \mathscr C \cup \{e\}\) 使得 \(C \cap D = \{e\}\),與 Lemma A 矛盾。

如果 Join 輸了,那麼 \(e \notin \operatorname{span}(\mathscr J) \implies r(\mathscr J \cup \{e\}) = r(\mathscr J) + 1\),所以 \(r_{\mathcal M^*}(\mathscr C) = |\mathscr C| + r(X' \setminus \mathscr C) - |X'| = |\mathscr C| + r(\mathscr J \cap \{e\}) - |X'| = |\mathscr C| + r(\mathscr J) + 1 = |\mathscr C \cup \{e\}| + r(\mathscr J) - |X'| = r_{\mathcal M ^*}(\mathscr C \cup \{e\}) \implies e \in \operatorname{span}(\mathscr C)\),所以 Cut 贏了。

\(\square\)


於是我們不難得到我們構造的對稱遊戲和原來的遊戲是等價的。

順便說一句,既然是對稱的遊戲,Cut Game 的條件應該和 Join Game 的條件是相應的,所以 Cut Game 的條件是 \(\exists A,B \subseteq S\) 使得 \(A \cap B = \varnothing\)\(e \in \operatorname{span}_{\mathcal M^*}(A) = \operatorname{span}_{\mathcal M^*}(B)\)

我們回憶一下擬陣基壓縮性質,當 \(k=2\) 的時候,存在兩個不交的基的條件是 \(\forall U \subseteq X'\) 滿足 \(|X' \setminus U| \geq 2(r(X') - r(U))\)。這個顯然也可以表示為:

  • \(\forall U \subseteq X'\) 滿足 \(2r(U) - |U| \geq 2r(X') - |X'|\)
  • \(2r(X') - |X'| = \min _{U \subseteq X'}(2r(U) - |U|)\)
  • \(U = X'\)\(g(U) = 2r(U) - |U|\) 取到最小值

(命題 C) 所以我們不難得到對於 \(F \subseteq X'\) 存在 \(A, B\) 使得 \(A \cap B = \varnothing\) 並且 \(F = \operatorname{span}(A) = \operatorname{span}(B)\),當且僅當 \(2r(F) - |F| = \min _{U \subseteq F}(2r(U) - |U|)\)

因為 \(r(U)\) 具有次模性,\(|U|\) 具有模性,所以 \(g(U)\) 也具有次模性。


Lemma D\(\mathcal L = \{S \subseteq X' : 2r(S) - |S| = \min _{U \subseteq X'}(2r(U) - |U|)\}\)。則若 \(A,B \in \mathcal L\)\(A \cup B \in L\)\(A \cap B \in L\)

Proof. 因為 \(g(U)\) 具有次模性,所以 \(2 \min _{U \subseteq X'}(2r(U) - |U|) = (2r(A) - |A|) + (2r(B) - |B|) \geq (2r(A \cap B) - |A \cap B|) + (2r(A \cup B) - |A \cup B|)\)。所以 \(2r(A \cap B) - |A \cap B| = 2r(A \cup B) - |A \cup B| = \min _{U \subseteq X'}(2r(U) - |U|)\)。所以 \(A \cap B\)\(A \cup B\) 都在 \(\mathcal L\) 中。

\(\square\)


\(\hat X = \arg \min _{U \subseteq X}(2r(U) - |U|)\)

根據命題 C,我們可以得到:

\[e \in \operatorname{span}_\mathcal M(\hat X) \iff \exists A,B \subset X, A \cap B = \varnothing, e \in \operatorname{span}_\mathcal M(A) = \operatorname{span}_\mathcal M(B) \]

因為 \(r_{\mathcal M^*}(U) = |U| + r(X' \setminus U) - r(X')\),所以

\[2r_{\mathcal M^*}(U) - |U| = |U| + 2r(X' \setminus U) - 2r(X') = 2r(X' \setminus U) - |X' \setminus U| + (|X'| - 2r(X')) \]

所以 \(U\) 使 \(2r_{\mathcal M^*}(U) - |U|\) 取到最小值當且僅當 \(X' \setminus U\) 使 \(2r(U) - |U|\) 取到最小值。


Lemma E 如果 \(e \notin \operatorname{span}(\hat X)\)\(\forall Y \subseteq X'\)\(2r(\hat X) - |\hat X| \leq 2r(Y) - |Y|\)

Proof. 假設存在 \(Y\) 使得 \(2r(\hat X) - |\hat X| ? 2r(Y) - |Y|\)

根據 \(\hat X\) 的定義我們不難得到 \(e \in Y\),並且 \(2r(Y \setminus \{e\}) - |Y \setminus \{e\}| \geq 2r(\hat X) - |\hat X| > 2r(Y) - |Y|\)

因為 \(1 > 2r(Y) - 2r(Y \setminus \{e\}\),所以 \(r(Y) = r(Y \setminus \{e\})\)

所以 \(2r(Y \setminus \{e\}) - |Y \setminus \{e\}| = 2r(\hat X) - |\hat X|\),並且 \(Y \setminus \{e\} \subseteq \hat X\)

但是 \(e \in \operatorname{span}(Y \setminus \{e\})\),所以 \(e \in \operatorname{span}(\hat X)\),矛盾。

\(\square\)


根據命題 C,存在兩個 \(X' \setminus \hat X\) 的子集滿足 \(\operatorname{span}_{\mathcal M^*}(A) = \operatorname{span}_{\mathcal M^*}(B) = X' \setminus \hat X \ni e\)

所以如果 \(e \notin \operatorname{span}(\hat X)\),Cut 作為先手有必勝策略。(Cut 可以像 Join 的必勝策略那樣玩,先手保證其必勝)

\(\square\)

因為必勝策略並不依賴於 \(e\),所以他們並不需要提前知道 \(e\)

6.4 Shannon 開關遊戲的玩法

這裡只介紹圖擬陣上面 Shannon 開關遊戲怎麼玩。因為這是一個次模性函式最小值的問題,其他擬陣的該問題我不太會。感興趣的讀者可以看看這篇論文:S. Thomas McCormick. Submodular Function Minimization[J]. Handbooks in Operations Research and Management Science,2005,12

為了輸出具體的操作,我們需要計算 \(\hat X\)

我們令選出的集合為 \(U\)。記 \(U\) 連線的節點集合是 \(S\),則如果 \(\hat X = U\)\(r(U)\) 一定為 \(|S| - 1\),並且 \(U\) 為一個匯出子圖,記為 \(E(S)\)

所以我們需要找使得 \(2|S| - 2 - |U|\) 最小的 \(S\)

這個顯然可以用最小割來解決。構造一個圖,圖中的點是 \(V \cup \{s, t\}\),其中 \(s,t\) 是源點和匯點,邊是

  • 對於原圖中有的邊 \((u,v)\),我們使 \((u,v)\)\((v,u)\) 的容量為 1。
  • \(P = \{v \in V | |\delta(v)| > 4\}\)\(N = \{v \in V | |\delta(v)| < 4\}\)。對於 \(v \in P\),有容量為 \(|\delta(v)| - 4\) 的邊 \((v, t)\);對於 \(v \in N\),有容量為 \(4 - |\delta(t)|\) 的邊 \((s, v)\)

考慮圖中 \(U \cup \{s\}\)\((V \setminus U) \cup \{t\}\) 分開的某一個割。他的容量:

\[\begin{aligned} &|\delta(U)| + \sum _{v \in U \cap P} (|\delta(v)| - 4) + \sum _{v \in N \setminus U} (4 - |\delta(v)|) \\ &= |\delta(U)| + \sum _{v \in V \setminus U} (4 - |\delta(v)|) + \sum_{v \in P} (|\delta(v)| - 4) \\ &= 4|V \setminus U| - 2|E(V \setminus U)| + \sum _{v \in P} (|\delta(v)| - 4) \end{aligned} \]

所以最小化 \(2|S| - |U|\) 相當於一個最小割。

我們考慮列舉 \(i \in V\),然後找到 \(s\)\(i,t\) 之間的最小割。

最大流即可,為了找到方案可以在殘量網路中找到 \(s\) 可達的節點。

Part 7. 例題

這一部分是一些關於擬陣的可以在 OJ 上面提交的題目。

7.1 最小生成樹

各大 OJ 上面的最小生成樹模板題都可以交,這裡就不貼出連結了。

本題解法見【3.2 帶權的一般情況 & 重溫 Kruskal 演算法】,程式碼同 Kruskal 演算法的程式碼。

7.2 無向圖方向問題

(我覺得這個經典問題應該網上有,但是我沒找到,知道的同學聯絡我

給定一張無向圖,你需要給邊標上方向,使得點 \(v\) 的入度小於等於 \(k_v\)

不知道你看到這個問題是否立刻想到網路流,但是其實這個問題也可以用擬陣交解決。

考慮每條無向邊都變成兩條有向邊之後用擬陣交求解。

構造兩個劃分擬陣,即:

\[\mathcal M_1 = \langle E, \mathcal I_1 = \{F:|F \cap \{(u, v), (v, u)\} \le 1\rangle \\ \mathcal M_2= \langle E, \mathcal I_2= \{F:|F \cap \delta^-_v| \le k_v\rangle \]

其中 \(\delta^-\) 表示入邊。

算出兩個擬陣的交就可以了。

7.3 Game of connect

UVA12370 Game of Connect

是 Shannon 開關遊戲問題的簡化版。

講解可以看 Part 6,這裡直接上程式碼。

int n, m, to[M], head[N], p[N], nxt[M], vis[M], dep[N], dis[M], pre[M];
bool in[M], v1[M], v2[M];
std::queue<int> Q;

int dfs(int u)
{
  int low = dep[u];
  for (int e = head[u]; e != -1; e = nxt[e])
    if (!vis[e >> 1])
    {
      vis[e >> 1] = 1;
      int v = to[e];
      if (~dep[v])
      {
        cmin(low, dep[v]);
        v1[e >> 1] = 1;
      }
      else
      {
        dep[v] = dep[u] + 1;
        int tmp = dfs(v);
        cmin(low, tmp);
        v1[e >> 1] = tmp <= dep[u];
      }
    }
  return low;
}

bool augment()
{
  memset(v2, 0, sizeof(v2));
  memset(head, -1, sizeof(head));
  for (int i = 0; i < m << 1; ++i)
    if (!in[i >> 1])
    {
      nxt[i] = head[to[i ^ 1]];
      head[to[i ^ 1]] = i;
    }
  memset(vis, 0, sizeof(vis));
  memset(dep, -1, sizeof(dep));
  dep[0] = 0;
  dfs(0);
  dsu.init(n);
  for (int i = 0; i < m << 1; ++i)
    if (in[i >> 1])
      dsu.merge(to[i], to[i ^ 1]);
  memset(dis, -1, sizeof(dis));
  while (!Q.empty())
    Q.pop();
  for (int i = 0; i < m; ++i)
    if (!in[i])
    {
      v2[i] = dsu.find(to[i << 1]) != dsu.find(to[i << 1 | 1]);
      if (v2[i])
        dis[i] = 0, pre[i] = -1, Q.push(i);
    }
  while (!Q.empty())
  {
    int u = Q.front();
    Q.pop();
    if (!in[u] && v1[u])
    {
      while (~u)
        in[u] ^= 1, u = pre[u];
      return 1;
    }
    if (in[u])
    {
      dsu.init(n);
      for (int i = 0; i < m; ++i)
        if (in[i] && i != u)
          dsu.merge(to[i << 1], to[i << 1 | 1]);
      for (int v = 0; v < m; ++v)
        if (!in[v] && dis[v] == -1 && dsu.find(to[v << 1]) != dsu.find(to[v << 1 | 1]))
          dis[v] = dis[u] + 1, pre[v] = u, Q.push(v);
    }
    else
    {
      dsu.init(n);
      int comp = n;
      for (int i = 0; i < m; ++i)
        if (!in[i] && i != u)
          comp -= dsu.merge(to[i * 2], to[i * 2 + 1]);
      for (int v = 0; v < m; ++v)
        if (in[v] && dis[v] == -1 && (comp == 1 || (comp == 2 && dsu.find(to[v * 2]) != dsu.find(to[v * 2 + 1]))))
          dis[v] = dis[u] + 1, pre[v] = u, Q.push(v);
    }
  }
  return 0;
}

bool mian()
{
  scanf("%d%d", &n, &m);
  dsu.init(n);
  for (int i = 0; i < m; ++i)
  {
    scanf("%d%d", &to[i * 2], &to[i * 2 + 1]);
    dsu.merge(to[i * 2], to[i * 2 + 1]);
  }
  for (int i = 1; i < n; ++i)
    if (dsu.find(0) != dsu.find(i))
      return 0;
  memset(in, 0, sizeof(in));
  int res = 0;
  while (augment())
    ++res;
  return res == n - 1;
}

7.4 Seollao

Problem - 1284G - Codeforces

有一個 \(n \times m\) 的網格圖,一些格子裡面有石頭,剩下的格子是空著的。我們定義一個格子的鄰居為其上下左右的格子所。我們把每個格子都黑白染色,染色方案為:左上角的格子 \((1,1)\) 是黑色的,每一個格子的顏色必須和他的鄰居的顏色不同。

你可以在相鄰的格子之間放一些牆。如果兩個格子之見有一堵牆,則這兩個格子將不再是鄰居。迷宮必須滿足以下性質:

  • 對於任意兩個空閒的格子,存在且僅存在一條簡單路徑(簡單路徑即:從一個格子出發,到達另一個格子,經過的格子不重複,且不能撞牆)
  • 一開始的時候,孩子們會都待在 \((1,1)\),然後到一些格子裡面躲藏。這些格子必須滿足他們是空閒的,並且他們只有一個空閒的鄰居。
  • 孩子們只能在白色格子裡面躲藏。

輸入這個花園的地圖,輸出符合要求的迷宮。

題目中所說的“只有一條簡單路徑”,即我們需要構造一棵生成樹,且要滿足葉節點的顏色一定是白色。

我們注意到黑色的節點只與白色節點相鄰,所以黑色的點集和白色的點集是 \(2\) 個獨立集。

Theoreom 能找到一個無環的子圖使得所有的黑點的度都為 \(2\) 是答案存在的充必條件。

Proof. 由於它是無環子圖,則我們可以添上一些邊讓他變成一顆生成樹。而樹的葉子節點的度數為 \(1\),所以添邊後形成的生成樹是符合條件的。

如果存在答案,我們將生成樹中的一些邊刪去,則我們一定可以得到一個無環子圖使得黑點的度都是 \(2\)\(\square\)

然後是不是就很容易解決了。

接下來我們考慮怎麼處理這個問題。

我們顯然可以用圖擬陣 \(\mathcal M_1\) 解決無環的問題。

我們發現度數恰好為 2 是很難構造的。但是如果我們有度數 \(\le 2\),判斷是否符合要求是很簡單的。

我們考慮構造一個擬陣 \(\mathcal M_2 = \langle X,\mathcal I_2\rangle\),其中 \(\mathcal I_2\) 需要滿足所有黑點度數 \(\le 2\) 的方案都獨立。

然後直接求擬陣交就可以了。

邊數為 \(\mathcal O(nm)\),所以總的時間複雜度為 \(\mathcal O(n^3m^3)\)

上程式碼。

class Matroid
{
private:
  const int fx[4] = {-1, 0, 0, 1};
  const int fy[4] = {0, -1, 1, 0};

  struct tuple
  {
    int x, y;
  };

  int n0, n1, n, m, demands;
  int count[801], dist[801], prev[801], que[801];
  bool vis[805], ok1[801], ok2[801];
  char grid[21][21], ans[41][41];
  tuple E[801];

#define make_tuple(x, y) ((tuple){x, y})
#define id(x, y) ((x)*n1 + y)
#define valid(x, y) ((x + y) > 0 && (x + y) % 2 == 0)
#define checkx(x) (x >= 0 && x < n0)
#define checky(x) (x >= 0 && x < n1)

  IL void get_edges(int i, int j)
  {
    for (int k = 0; k < 4; ++k)
    {
      int u = i + fx[k], v = j + fy[k];
      if (checkx(u) && checky(v) && grid[u][v] == 'O')
        E[m++] = make_tuple(id(i, j), id(u, v));
    }
  }

  bool augument()
  {
    dsu.init(n);
    memset(count, 0, sizeof(count));
    memset(dist, -1, sizeof(dist));
    for (int i = 0; i < m; ++i)
      if (vis[i])
      {
        dsu.merge(E[i].x, E[i].y);
        ++count[E[i].x];
      }
    int tail = 0;
    for (int i = 0; i < m; ++i)
    {
      ok1[i] = !vis[i] && dsu.find(E[i].x) != dsu.find(E[i].y);
      ok2[i] = !vis[i] && count[E[i].x] < 2;
      if (ok1[i])
      {
        dist[i] = 0, prev[i] = -1, que[tail++] = i;
        if (ok2[i])
        {
          vis[i] = true;
          return true;
        }
      }
    }
    for (int head = 0; head < tail; ++head)
    {
      int u = que[head];
      if (ok2[u])
      {
        while (~u)
          vis[u] ^= 1, u = prev[u];
        return true;
      }
      if (vis[u])
      {
        dsu.init(n);
        for (int i = 0; i < m; ++i)
          if (vis[i] && i != u)
            dsu.merge(E[i].x, E[i].y);
        for (int v = 0; v < m; ++v)
          if (!vis[v] && dsu.find(E[v].x) != dsu.find(E[v].y) && dist[v] == -1)
            dist[v] = dist[u] + 1, prev[v] = u, que[tail++] = v;
      }
      else
        for (int v = 0; v < m; ++v)
          if (vis[v] && count[E[u].x] - (E[u].x == E[v].x) < 2 && dist[v] == -1)
            dist[v] = dist[u] + 1, prev[v] = u, que[tail++] = v;
    }
    return false;
  }

public:
  void solve()
  {
    n0 = io::in(), n1 = io::in();
    for (int i = 0; i < n0; ++i)
      io::gets(grid[i]);
    n = n0 * n1, m = demands = 0;
    for (int i = 0; i < n0; ++i)
      for (int j = 0; j < n1; ++j)
        if (grid[i][j] == 'O' && valid(i, j))
          demands += 2, get_edges(i, j);
    while (augument())
      --demands;
    if (demands)
      pc('N'), pc('O'), pc('\n');
    else
    {
      pc('Y'), pc('E'), pc('S'), pc('\n');
      get_edges(0, 0);
      dsu.init(n);
      for (int t = 0; t < 2; ++t)
        for (int i = 0; i < m; ++i)
        {
          bool connected = dsu.find(E[i].x) == dsu.find(E[i].y);
          if (t && !connected)
            vis[i] = true;
          if (vis[i] && !connected)
            dsu.merge(E[i].x, E[i].y);
        }
      for (int i = 0; i < n0 * 2 - 1; ++i)
        for (int j = 0; j < n1 * 2 - 1; ++j)
          ans[i][j] = ' ';
      for (int i = 0; i < n0; ++i)
        for (int j = 0; j < n1; ++j)
          ans[i * 2][j * 2] = grid[i][j];
      for (int i = 0; i < m; ++i)
        if (vis[i])
        {
          int s = min(E[i].x, E[i].y);
          int s1 = max(E[i].x, E[i].y);
          if (s + 1 == s1)
            ans[s / n1 * 2][s % n1 * 2 + 1] = 'i';
          else
            ans[s / n1 * 2 + 1][s % n1 * 2] = '!';
        }
      for (int i = 0; i < n0 * 2 - 1; ++i)
      {
        for (int j = 0; j < n1 * 2 - 1; ++j)
          pc(ans[i][j]);
        pc('\n');
      }
    }
  }
};

7.5 Rainbow Graph

19. Rainbow Graph — Prime New Year Contest - 2018 Rainbow Graph – Kattis Rainbow Graph - 計蒜客

有一張有向圖,每一條邊有一個顏色和一個權值。顏色有 RGB 三種。要求:選出 \(k\) 條邊,使得 R+G 和 B+G 的邊的組合均能使圖聯通,並且方案的總權值最小。

對於 \(1 \le k \le m\) 都要求出答案,無解輸出 -1。

我們考慮 RG / BG 的限制很討厭,但是這兩個條件又恰好是圖擬陣的對偶擬陣的條件,所以我們就直接求出兩個圖擬陣(一個對應 R+G 的圖,一個對應 B+G 的圖)的帶權擬陣交就可以了。

是帶權擬陣交的模板題啦~

上程式碼。

#include <bits/stdc++.h>

const int N = 105;

class DSU
{
private:
  int f[N];

public:
  int components;

  inline void init(int n)
  {
    for (register int i = 0; i < n; ++i)
      f[i] = i;
    components = n;
  }

  inline int find(int x)
  {
    while (x != f[x])
      x = f[x] = f[f[x]];
    return x;
  }

  inline void merge(int x, int y)
  {
    int fx = find(x), fy = find(y);
    if (fx != fy)
      f[fx] = fy, --components;
  }
} dsu;

int n, m, a[N], b[N], w[N], c[N], pre[N], res[N];
int in[N], G[N][N], vis[N], ok[2][N];
std::pair<int, int> dist[N];
std::queue<int> Q;

int augment()
{
  memset(ok, 0, sizeof(ok));
  memset(G, 0, sizeof(G));
  for (int t = 0; t < 2; ++t)
  {
    for (int i = 0; i < m; ++i)
      if (!vis[i])
      {
        dsu.init(n);
        for (int j = 0; j < m; ++j)
          if (!vis[j] && j != i && c[j] != t)
            dsu.merge(a[j], b[j]);
        ok[t][i] = dsu.components == 1;
        for (int j = 0; j < m; ++j)
          if (vis[j])
          {
            int &ref = t ? G[i][j] : G[j][i];
            ref = dsu.components == 1;
            if (c[j] != t)
              ref |= dsu.components == 2 && dsu.find(a[j]) != dsu.find(b[j]);
          }
      }
  }
  for (int i = 0; i < m; ++i)
    dist[i] = {INT_MAX, INT_MAX};
  memset(in, 0, sizeof(in));
  for (int i = 0; i < m; ++i)
    if (ok[0][i])
      dist[i] = {-w[i], 1}, pre[i] = -1, in[i] = true, Q.push(i);
  while (!Q.empty())
  {
    int u = Q.front();
    Q.pop();
    in[u] = false;
    for (int v = 0; v < m; ++v)
    {
      std::pair<int, int> cur = dist[u];
      cur.first += vis[v] ? w[v] : -w[v], ++cur.second;
      if (G[u][v] && cur < dist[v])
      {
        dist[v] = cur, pre[v] = u;
        if (!in[v])
          in[v] = true, Q.push(v);
      }
    }
  }
  std::pair<std::pair<int, int>, int> best{std::pair<int, int>{INT_MAX, INT_MAX}, -1};
  for (int i = 0; i < m; ++i)
    if (ok[1][i])
      best = std::min(best, std::make_pair(dist[i], i));
  if (best.second == -1)
    return false;
  for (int u = best.second; ~u; u = pre[u])
    vis[u] ^= 1;
  return true;
}

int main()
{
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; ++i)
  {
    char s[4];
    scanf("%d%d%d%s", &a[i], &b[i], &w[i], s);
    --a[i], --b[i];
    if (s[0] == 'B')
      c[i] = 0;
    else if (s[0] == 'R')
      c[i] = 1;
    else
      c[i] = 2;
  }
  memset(res, -1, sizeof(res));
  res[m] = 0;
  for (int i = 0; i < m; ++i)
    res[m] += w[i];
  memset(vis, 0, sizeof(vis));
  for (int i = m; i-- && augment();)
  {
    res[i] = 0;
    for (int j = 0; j < m; ++j)
      if (!vis[j])
        res[i] += w[j];
  }
  for (int i = 1; i <= m; ++i)
    printf("%d\n", res[i]);
  return 0;
}

7.6 Pick Your Own Nim

Problem - D - Codeforces

Alice 和 Bob 每個人有一些盒子,每個盒子裡面有幾堆石子。每個人先從自己的每個盒子裡面選出一堆石子,然後 Alice 從所有選出的石子堆中選出一個非空子集,然後兩個人在這個子集上玩 Nim 遊戲,Bob 先手。現在給出 Alice 選出的石子和 Bob 手裡盒子的情況,求一個無論 Alice 怎麼選子集 Bob 都有必勝策略的選石子堆方案,沒有輸出 \(-1\)

簡化:不存在異或和為 \(0\) 的子集。顯然我們可以把他直接變成在 \(\mathbb Z _2^{60}\) 上的獨立集。

然後考慮“每個盒子只能選出一堆”的限制,所以我們把線性擬陣和有色擬陣求擬陣交就可以了。

程式碼以後會有的

7.7 Yet Another Binary Matrix

Problem - F - Codeforces

給你一個 \(n \times n\) 的 01 方陣,\(R\) 是行的集合,\(C\) 是列的集合。記 \(W(P,Q)\) 為一個 \(|P|\)\(|Q|\) 列的矩陣,第 \(i\) 行,第 \(j\) 位和方陣中的第 \(P_i\) 行和 \(Q_j\) 列是一樣的。給你一個行的集合 \(A\) 和列的集合 \(B\),找到列的集合 \(X\) 使得 \(X \cap B = \varnothing\) 並且 \(W(A, X \cup B)\) 的行是線性獨立的並且 \(W(R \setminus A, C \setminus \{X \cup B\})\) 的行是線性獨立的。

簡化:讓 \(r(W(A, X \cup B)) + r(W(R \setminus A, C\setminus \{X \cup B\})) = |W|\)

然後直接求出線性擬陣和一個線性擬陣的對偶的交就好了。

程式碼以後會有的


如果還有別的擬陣交的題就和我說,比較好玩的我會加進來的

Part 8. 總結

總之,擬陣是一個強大的工具,可以解決種種其他方法難以解決(並且一眼看上去根本沒思路)的問題。

感興趣的同學可以自行百度搜尋關於擬陣的更多的內容(有很多比較高深的內容)!

Thank you for your time!

相關文章