《<圖上的遊戲>命題報告》學習筆記
《<圖上的遊戲>命題報告》學習筆記
簡要題意
這是一道互動題。
互動器有一個無自環的無向連通圖 \(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\)
鏈的做法
按照隨機順序加入所有點,維護已加入點的相對順序以及兩兩相鄰點之間的邊集。加入一個點時可以二分找到它的位置,然後暴力判斷它插入的區間中的所有邊在它的哪一側。期望詢問次數為 \(O(n\log n)\)。
樹的做法
不妨設該樹以 \(0\) 為根。
考慮將樹拆成若干條鏈。具體地,給每個非根結點一個顏色,使所有同色的點組成了樹上的一條鏈。且滿足每條鏈頂端的父親所在的鏈的顏色比它小。設一條邊的顏色為其較深的端點的顏色。
初始時所有點和邊均無顏色。考慮依次加入所有點,維護已確定的所有邊的顏色。不妨設此時加入的節點為 \(u\)
- 若 \(u\) 可以被已確定顏色的邊與根連通,則說明 \(u\) 的顏色已出現過。可以通過二分來確定 \(u\) 的具體顏色(每次保留顏色 \(\leq mid\) 的邊,判斷 \(u\) 和根是否連通)。
- 否則,令 \(u\) 的顏色為一種新的顏色(比所有其他顏色都大)。接著確定所有這種顏色的邊,注意到可以通過前置演算法求出(一個無色邊集 \(S\) 包含此類邊,當且僅當保留 \(E\setminus S\) 時 \(u\) 和根無法聯通)。
拆分成鏈後,鏈內部的邊可以通過鏈的做法求出,於是只用求出每條鏈頂端的父親。
考慮按照顏色從小到大確定所有鏈,每次可以通過二分 dfs 序來求出鏈頂的父親(保留兩個端點 dfs 序均 \(\leq mid\)
詢問次數 \(O(n\log n)\)。
圖的做法
考慮先找出一棵生成樹。
考慮依次加入所有點,維護連通已加入點的生成樹。加入節點 \(u\) 時,進行如下操作直到僅保留樹邊後 \(u\) 能與根連通:
- 依次刪除每條非樹邊直到 \(u\) 不能與根連通,將最後被刪的邊加入樹邊,然後還原所有被刪除的邊。容易發現此做法可以通過二分字首來優化詢問次數。
確定了生成樹之後樹邊可以通過樹的做法求出,於是只用確定非樹邊。
考慮按 dfs 序倒序每次確定一個節點,然後將連向該點所有的邊刪除。不妨設此時的待確定節點為 \(u\)(不難發現此時 \(u\) 一定為葉子),可以通過前置演算法求出連向 \(u\) 的所有非樹邊集合(一個非樹邊集 \(S\) 包含連向 \(u\) 的邊,當且僅當保留 \(S\) 和除了 \(u\) 連向父親的邊之外的所有樹邊後 \(u\) 和根可以連通)。然後可以通過二分 dfs 序來確定每條邊的另一個端點。
詢問次數 \(O(n\log n)\)。