1. 程式人生 > 其它 >《<圖上的遊戲>命題報告》學習筆記

《<圖上的遊戲>命題報告》學習筆記

神仙題。

《<圖上的遊戲>命題報告》學習筆記

簡要題意

這是一道互動題。

互動器有一個無自環的無向連通圖 \(G=(V=\{0,1,\ldots,n-1\},E=\{0,1,\ldots,m-1\})\)。你需要通過如下詢問來確定這張圖:每次詢問你可以給出 \(S\subset E,u\in V\),互動器會返回在 \(G'=(V,E\setminus S)\)\(0\)\(u\) 是否聯通。保證互動器不自適應。

\(1\leq n,m\leq 600\),詢問次數上線為 \(3000\)

題解

前置演算法

對於一個大小為 \(n\) 的集合\(S\),其中有 \(m\) 個好元素。若每次可以選定 \(T\subset S\)

,詢問 \(T\) 中是否有好元素。那麼可以通過對 \(S\) 分治,在 \(O(m\log n)\) 次詢問內找到所有好元素。

鏈的做法

按照隨機順序加入所有點,維護已加入點的相對順序以及兩兩相鄰點之間的邊集。加入一個點時可以二分找到它的位置,然後暴力判斷它插入的區間中的所有邊在它的哪一側。期望詢問次數為 \(O(n\log n)\)

樹的做法

不妨設該樹以 \(0\) 為根。

考慮將樹拆成若干條鏈。具體地,給每個非根結點一個顏色,使所有同色的點組成了樹上的一條鏈。且滿足每條鏈頂端的父親所在的鏈的顏色比它小。設一條邊的顏色為其較深的端點的顏色。

初始時所有點和邊均無顏色。考慮依次加入所有點,維護已確定的所有邊的顏色。不妨設此時加入的節點為 \(u\)

  • \(u\) 可以被已確定顏色的邊與根連通,則說明 \(u\) 的顏色已出現過。可以通過二分來確定 \(u\) 的具體顏色(每次保留顏色 \(\leq mid\) 的邊,判斷 \(u\) 和根是否連通)。
  • 否則,令 \(u\) 的顏色為一種新的顏色(比所有其他顏色都大)。接著確定所有這種顏色的邊,注意到可以通過前置演算法求出(一個無色邊集 \(S\) 包含此類邊,當且僅當保留 \(E\setminus S\)\(u\) 和根無法聯通)。

拆分成鏈後,鏈內部的邊可以通過鏈的做法求出,於是只用求出每條鏈頂端的父親。

考慮按照顏色從小到大確定所有鏈,每次可以通過二分 dfs 序來求出鏈頂的父親(保留兩個端點 dfs 序均 \(\leq mid\)

的邊,判斷鏈頂和根是否連通),然後更新該鏈的 dfs 序。

詢問次數 \(O(n\log n)\)

圖的做法

考慮先找出一棵生成樹。

考慮依次加入所有點,維護連通已加入點的生成樹。加入節點 \(u\) 時,進行如下操作直到僅保留樹邊後 \(u\) 能與根連通:

  • 依次刪除每條非樹邊直到 \(u\) 不能與根連通,將最後被刪的邊加入樹邊,然後還原所有被刪除的邊。容易發現此做法可以通過二分字首來優化詢問次數。

確定了生成樹之後樹邊可以通過樹的做法求出,於是只用確定非樹邊。

考慮按 dfs 序倒序每次確定一個節點,然後將連向該點所有的邊刪除。不妨設此時的待確定節點為 \(u\)(不難發現此時 \(u\) 一定為葉子),可以通過前置演算法求出連向 \(u\) 的所有非樹邊集合(一個非樹邊集 \(S\) 包含連向 \(u\) 的邊,當且僅當保留 \(S\) 和除了 \(u\) 連向父親的邊之外的所有樹邊後 \(u\) 和根可以連通)。然後可以通過二分 dfs 序來確定每條邊的另一個端點。

詢問次數 \(O(n\log n)\)

code

https://loj.ac/s/1147160