一類圖上二選一構造問題


一類圖上二選一構造問題

CF1198C Matching vs Independent Set

題目鏈接

題目大意

給定一張 \(3\cdot n\) 個節點、\(m\) 條邊,無自環、無重邊的無向連通圖。

定義一個匹配是一個邊的集合,滿足其中任意兩條邊沒有公共端點。

定義一個獨立集是一個點的集合,滿足其中任意兩個點沒有邊直接相連。

請你找出一個 \(n\) 條邊的匹配,一個 \(n\) 個點的獨立集。

數據范圍:\(1\leq n\leq 10^5\)\(0\leq m\leq 5\cdot 10^5\)


容易想到去求最大匹配。但是求一般圖最大匹配的帶花樹算法時間復雜度是 \(\mathcal{O}(n^3)\) 的。

考慮退而求其次,找出任意一個極大匹配。具體來說:我們每次取出一條邊,並將它的兩個端點刪掉(一個點被刪掉后,所有與它相連的邊也被刪掉),如此重復直到圖上沒有邊為止。顯然:

  • 被我們取出的邊,是一個匹配。因為一個點第一次被取到后,所有和它相連的邊就都被刪掉了,所以取出的邊之間不會有公共點。
  • 最終剩下的點,是一個獨立集。首先,最終狀態下,剩下的點之間肯定沒有邊(否則就還能繼續取)。並且它們之間原來也不會有邊,因為原圖上的一條邊,不會在兩個端點都未被刪除的情況下,平白無故消失。

考慮最終我們取出的邊的數量,記為 \(k\)

  • \(k \geq n\),則我們已經找出了一個 \(n\) 條邊的匹配。
  • \(k < n\),因為這 \(k\) 條邊是匹配,所以沒有公共端點,所以它們恰好占用了 \(2k\) 個點,所以還剩下 \(3n - 2k \geq n\) 個點。這意味着我們找出了一個 \(n\) 個點的獨立集。

綜上所述,一定有解。

時間復雜度 \(\mathcal{O}(n + m)\)

參考代碼-在CF查看

CF1364D Ehab's Last Corollary

題目鏈接

題目大意

給出一張 \(n\) 個點的無向連通圖和一個常數 \(k\)

你需要解決以下兩個問題的任何一個:

  1. 找出一個大小為 \(\lceil\frac{k}{2}\rceil\) 的獨立集。
  2. 找出一個大小不超過 \(k\) 的簡單環。

獨立集是一個點的集合,滿足其中任意兩點之間在原圖上沒有邊直接相連。

可以證明這兩個問題必然有一個可以被解決。

數據范圍:\(3\leq k\leq n\leq10^5\)\(n - 1\leq m\leq 2\cdot 10^5\)(邊數)。


以任意點為根,建出 DFS 樹。如果我們將每條邊按照第一次經過時的方向進行定向,則無向圖的 DFS 樹滿足所有非樹邊都是后向邊(即從一個節點連向其祖先的邊)。

如果存在一條非樹邊 \((u, v)\)\(v\)\(u\) 的祖先),滿足 \(\mathrm{dep}(u) - \mathrm{dep}(v) < k\),則取 \((u, v)\) 加上 \(v\)\(u\) 的樹上路徑即為一個長度不超過 \(k\) 的簡單環。

否則我們直接將節點按照深度的奇偶性划分為兩個集合。在其中較大的一個集合里,把節點按 DFS 時訪問的順序排列,取任意連續的 \(\lceil\frac{k}{2}\rceil\) 個點,就是一個大小為 \(\lceil\frac{k}{2}\rceil\) 的獨立集,證明如下:

  • 首先根據鴿巢原理,這個“較大的集合”,大小一定大於等於 \(\lceil\frac{k}{2}\rceil\)
  • 下面證明它是獨立集:
    • 因為任意一條樹邊的兩個端點,深度的奇偶性一定不同。所以上述做法得到的集合里,不存在兩個點被樹邊相連。
    • 對於一條非樹邊的兩個端點 \((u, v)\)\(v\)\(u\) 的祖先),設 \(d = \mathrm{dep}(u) - \mathrm{dep}(v)\),那么必有:\(d\geq k\)。把節點按 DFS 順序排列后,\(u, v\) 之間至少有 \(d + 1\) 個點。如果想要同時取到 \(u, v\),就必須取至少 \(\lceil\frac{d + 1}{2}\rceil\) 個點。而我們只取了 \(\lceil\frac{k}{2}\rceil\) 個點。\(k\) 為奇數且 \(d = k\) 時,\(u, v\) 深度奇偶性不同,不會被同時取到;否則 \(k\) 為偶數或 \(d > k\),那么必有 \(\lceil\frac{d + 1}{2}\rceil > \lceil\frac{k}{2}\rceil\)。綜上,\(u, v\) 不會被同時取到。

時間復雜度 \(\mathcal{O}(n + m)\)

CF1325F Ehab's Last Theorem

題目鏈接

題目大意

給出一張 \(n\) 個點的無向連通圖。

你需要解決以下兩個問題的任何一個:

  1. 找出一個大小為 \(\lceil\sqrt{n}\rceil\) 的獨立集。
  2. 找出一個大小至少\(\lceil\sqrt{n}\rceil\) 的簡單環。

獨立集是一個點的集合,滿足其中任意兩點之間在原圖上沒有邊直接相連。

可以證明這兩個問題必然有一個可以被解決。

數據范圍:\(5\leq n\leq10^5\)\(n - 1\leq m\leq 2\cdot 10^5\)(邊數)。


\(S = \lceil\sqrt{n}\rceil\)。顯然 \(S \geq 3\)

以任意點為根,建出 DFS 樹。如果我們將每條邊按照第一次經過時的方向進行定向,則無向圖的 DFS 樹滿足所有非樹邊都是后向邊(即從一個節點連向其祖先的邊)。

如果存在一條非樹邊 \((u, v)\)\(v\)\(u\) 的祖先),滿足 \(\mathrm{dep}(u) - \mathrm{dep}(v) \geq S - 1\),則取 \((u, v)\) 加上 \(v\)\(u\) 的樹上路徑即為一個大小至少為 \(S\) 的簡單環,可以完成任務 2。

否則,將節點按照深度 \(\bmod (S - 1)\) 的值,划分為 \(S - 1\) 類。此時,同一類節點如果是祖先 - 后代關系,那么它們在樹上深度差至少為 \(S - 1\),因此同一類節點之間一定沒有邊相連。

根據鴿巢原理,至少有一類節點的數量 \(\geq \lceil\frac{n}{S - 1}\rceil\geq S\),於是我們就找到了一個大小至少為 \(S\) 的獨立集,任取其中 \(S\) 個節點,即可完成任務 1。

時間復雜度 \(\mathcal{O}(n + m)\)

參考代碼-在CF查看

CF1391E Pairs of Pairs

題目鏈接

題目大意

給定一張 \(n\) 個節點、\(m\) 條邊,無自環、無重邊的無向連通圖。

考慮將其中的一些節點配對,使得每個節點至多只出現在一對中。如果對於任意兩對節點,這 \(4\) 個點的生成子圖至多只有 \(2\) 條邊,則稱該配對方案是合法的。

你需要解決以下兩個問題的任何一個:

  1. 找出一條包含至少 \(\lceil\frac{n}{2}\rceil\) 個節點的簡單路徑。
  2. 找出一組包含至少 \(\lceil\frac{n}{2}\rceil\) 個節點的合法的配對方案。

可以證明這兩個問題必然有一個可以被解決。

數據范圍:\(2\leq n\leq 5\cdot 10^5\)\(1\leq m\leq 10^6\)


\(l = \lceil\frac{n}{2}\rceil\)

以任意點為根,建出 DFS 樹。

定義一個節點的深度為,它到根路徑上的點數

設深度最大的點深度為 \(d\)。若 \(d \geq l\),則直接取深度最大的點到根的路徑,即可完成任務 1。

否則將節點按照深度分為 \(d\) 類。對於同一類點(也就是樹上同一層里的點),記它們為 \(\{u_1, u_2, \dots, u_k\}\),則依次配對:\((u_1, u_2), (u_3, u_4), \dots\)。若本層里的點數 \(k\) 為偶數,則恰好配完,否則會浪費一個。因為層數 \(d\leq l - 1\),所以最多只會浪費 \(l - 1\) 個,也就是用到的節點數量 \(\geq n - (l - 1)\geq l\)

又因為無向圖的 DFS 樹上不存在橫叉邊,所以對於任意兩對節點,這 \(4\) 個點的生成子圖至多只有 \(2\) 條邊。符合任務 2 的要求。

參考代碼-在CF查看

CF1439B Graph Subset Problem

題目鏈接

題目大意

給定一張 \(n\) 個點 \(m\) 條邊的無自環、無重邊無向圖,以及一個正整數 \(k\)

你需要解決以下兩個問題的任何一個:

  1. 找出一個大小為 \(k\) 的團。也就是找出 \(k\) 個節點使得它們的生成子圖是完全圖。
  2. 找出一個子圖,滿足子圖中任意節點都與至少 \(k\) 個同樣在子圖里的節點相連。

或者告知無解。

數據范圍:\(1\leq n, m, k\leq 10^5\)\(k\leq n\)


開始時,把所有點丟到一個 \(\texttt{set}\) 里。以度數為關鍵字。支持:查詢度數最小的點;修改一個點的度數(把原來的刪除,再把新的插入)。然后執行如下過程:

  1. 取出度數最小的點 \(u\)
  2. 如果它的度數 $ < k - 1$,顯然它不可能被加入任何一種答案里,所以可以直接將這個點刪除(同時與它相連的所有邊也會被刪除)。注意,刪除 \(u\) 以后,其他與 \(u\) 有連邊的點,度數可能會改變。回到步驟 1。
  3. 如果它的度數 $ = k - 1$。考慮 \(u\) 和它的 \(k - 1\) 個鄰居,是否構成一個。判斷的方式就是暴力枚舉 \(\frac{k(k - 1)}{2}\) 條邊,看它們是否都存在(判斷一條邊是否存在可以做到 \(\mathcal{O}(1)\),見這篇文章)。如果是一個團,那么直接輸出。否則點 \(u\) 就不可能出現在答案里了,將它刪掉,回到步驟 1。
  4. 如果所有點的度數都 \(\geq k\),那么整張圖就是一個“滿足第二種要求的子圖”,直接作為答案輸出即可。

在步驟 1 里,如果圖為空(沒有節點了),說明無解。

因為每次刪掉的都是絕不可能出現在答案里的點,所以上述做法的正確性是顯而易見的。

暴力判斷一個團的時間復雜度是 \(\mathcal{O}(k^2)\) 的,加起來是 \(\mathcal{O}(nk^2)\)。但是注意到,只有當 \(\frac{k(k - 1)}{2}\leq m\) 時,我們才需要判斷。並且度數 \(\geq k - 1\) 的點只有 \(\mathcal{O}(\frac{m}{k})\) 個,所以這部分的總復雜度是 \(\mathcal{O}(\frac{m}{k}\cdot k^2) = \mathcal{O}(m\sqrt{m})\)

總時間復雜度 \(\mathcal{O}(n\log n + m\sqrt{m})\)

LOJ3113 「SDOI2019」熱鬧的聚會與尷尬的聚會

題目鏈接

題目大意

給定一張 \(n\) 個點 \(m\) 條邊的簡單無向圖。請求出:

  1. 一個點集 \(A\)。設它的導出子圖里,度數最小的點的度數為 \(p\)
  2. 一個點集 \(B\),滿足它是原圖的一個獨立集。設它的大小為 \(q\)

點集 \(A\)\(B\) 可以有交,也可以有節點不在任何一個點集里。

你需要構造出這樣的兩個點集,使得 \(\lfloor\frac{n}{p + 1}\rfloor \leq q\)\(\lfloor\frac{n}{q + 1}\rfloor \leq p\)

數據范圍:\(T\leq 32\) 組測試數據。對於每組測試數據:\(1\leq n\leq 10^4\)\(1\leq m\leq 10^5\)


條件可以改寫成:\((p + 1)(q + 1) > n\)。因此顯然是 \(p, q\) 越大越好。

因為兩個點集互不影響,考慮獨立地將它們構造出來。也就是把 \(p, q\) 分別最大化

先考慮最大化 \(p\)。首先將所有點都放入點集,此時 \(p\) 就是圖里度數最小的點的度數,記為 \(p_t\)。然后如果我們想要使 \(p\) 變得更大,則顯然必須刪去度數最小的點。將它刪去后,其他點的度數也會相應地變化。我們不斷重復此過程,直到圖被刪空為止。記下整個過程中 \(p_t\) 最大的時刻,將那一時刻的圖作為第一個點集。

最大化 \(q\) 則比較困難。【一般圖最大獨立集】本身是沒有多項式復雜度做法的。此時如果用模擬退火等隨機化算法,強行求“最大獨立集”,據說能得到不錯的分數,因為題目給出的界其實很松。拋開隨機,題目既然將兩個問題放在一起,說明他們之間肯定有內在聯系。於是結合上面的做法,去考慮求獨立集。

上面的做法里,我們每次會刪掉度數最小的點 \(u\)。並且在刪之前的時刻,\(p_t\) 就等於 \(u\) 的度數。現在我們對該做法進行一點點修改:

  1. 仍然每次選出度數最小的點 \(u\)
  2. \(u\) 加入第二個點集
  3. 將所有與 \(u\) 相鄰的點從圖上刪去
  4. 將點 \(u\) 從圖上刪去。

最后仍然取整個過程中 \(p_t\) 最大的時刻,將那一時刻的圖作為第一個點集。但是注意,無論取了哪個時刻作為第一個點集,這將不會影響第二個點集的選取:在該時刻之后發生的、向第二個點集里加點的操作,仍然有效。步驟 3 保證了我們求出的第二個點集是獨立集。

接下來問題的關鍵就是,這樣求出的 \(p, q\) 是否滿足大小的要求呢?

答案是肯定的。因為每當一個點 \(u\) 被加入獨立集,它會同時刪掉與它相鄰的點,也就是刪去的點數等於 \(u\) 的度數,等於彼時彼刻的 \(p_t\)。又因為最終作為答案的 \(p\) 是所有 \(p_t\) 里的最大值,所以每次被刪除的點數都不超過 \(p\) 。所以獨立集里的點數 \(q\geq \lceil\frac{n}{p + 1}\rceil\),所以 \((p + 1)(q + 1) > n\)

綜上,我們構造出了符合所有要求的答案。

每次取度數最小的點,並支持修改一個點的度數,可以用線段樹或 \(\texttt{set}\) 實現。時間復雜度 \(\mathcal{O}((n + m)\log n)\)

總結

在圖上,題目問了你兩個看似無關的問題,然后讓你任選其中一個給出解(構造出滿足條件的方案)。這些問題可能是:

  • 求滿足 ... 條件的簡單路徑。
  • 求滿足 ... 條件的簡單環。
  • 求滿足 ... 條件的子圖(獨立集,團,...)。
  • 求滿足 ... 條件的邊集。
  • ......

比較基礎的方法是:對其中一個任務,看出它所需的充分必要條件 \(X\)。判斷一下所給的圖,如果滿足 \(X\),則直接輸出答案。否則問題轉化為:【給出一張圖,保證不滿足 \(X\),請完成任務 2】。對着這個問題大力思考即可。如果不能一眼看出充分必要條件,那至少找一個充分條件。看看此時另一個任務是否必能完成。此外,還可以先嘗試解決其中一個任務。在解決的過程中,逐漸發現性質,或者發現兩個任務的內在聯系。

在無向圖上,DFS 樹是一個非常強大的工具,我們要善用它。

如果涉及到點的度數有關的問題,可以考慮每次把度數最小的點刪去,然后更新其他點的度數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM