天天看點

P4320 道路相遇

圓方樹的定義

圓方樹是用來解決仙人掌圖的問題的,那什麼是仙人掌圖呢?

即不存在邊同時屬于多個環的無向連通圖是一棵仙人掌。

要介紹圓方樹,首先要介紹點雙連通分量。

一個點雙連通圖的一個定義是:圖中任意兩不同點之間都有至少兩條點不重複的路徑。

一種簡單的定義:不存在割點的圖。

但這種定義對于兩點一邊的圖時是沒用的,它沒有割點,但是并不能找到兩條不相交的路徑,因為隻有一條路徑。(也可以了解為那一條路徑可以算兩次,但的确沒有相交,因為不經過其他點)。

在點雙連通圖内,一個點可能屬于多個點雙,但是一條邊屬于恰好一個點雙。

更多關于有向圖的強連通分量的知識,請看我的部落格 \(\to\) ​​強連通分量​​

更多關于點雙連通分量的知識,請看我的部落格 \(\to\) ​​雙連通分量​​

關于圓方樹的建圖,也比較簡單,将一個點雙連通分量内的所有邊删去,再将一個點雙連通分量中的每個點向一個建立的點連邊,這個建立的點即是方點。

是以在圓方樹中有 \(n+c\) 個點,其中 \(n\) 是原圖點數,\(c\) 是原圖點雙連通分量的個數。

每個點雙都可以形成一個菊花圖,多個菊花圖通過原圖中的割點連接配接在一起(因為點雙的分隔點是割點)。

顯然,圓方樹中每條邊連接配接一個圓點和一個方點。

在下面這張圖中,\([1,2,3,4,5]\) 是圓點,\([6,7]\) 是方點。

P4320 道路相遇

而如果圓方樹連通,則有以下性質:

方點之間不會存在連邊。

原圖的割點就是圓方樹中度數大于 \(1\) 的圓點。

圓方數是一棵非常好的樹,即點數等于邊數加 \(1\)。

圓方樹上任意一條路徑上圓點方點間隔分布。

如果圓點的 \(size\) 為 \(1\),那麼一個圓點子樹的 \(size\) 和就是它下面的所有點的數量。

對于一個點雙中的兩點,它們之間簡單路徑的并集,恰好完全等于這個點雙,即同一個點雙中的兩不同點 \(u\),\(v\) 之間一定存在一條簡單路徑經過給定的在同一個點雙内的另一點 \(w\)。也就是說,考慮兩圓點在圓方樹上的路徑,與路徑上經過的方點相鄰的圓點的集合,就等于原圖中兩點簡單路徑上的點集。

如果原圖中某個連通分量隻有一個點,則需要具體情況具體分析,我們在後續讨論中不考慮孤立點。

注意一條邊連接配接兩個點的在這裡不算點雙。

普通圓方樹隻能解決仙人掌圖上的問題,而廣義圓方樹則可以将所有無向圖轉化為圓方樹處理。

廣義圓方樹性質:圓點方點相間,不存在兩個‘’相同形狀‘’的點相連。

與圓方樹不同的是,廣義圓方樹需要把一條邊連接配接兩個點也看成一個點雙,原本兩個圓點有一條邊相連,現在在中間插入一個方點間隔開就好了。

可以參照這張圖

P4320 道路相遇

關于本題:​​洛谷 P4320 道路相遇​​

給定一無向圖,現在 ​<code>​yzh​</code>​ 要從 \(u\) 點到處于 \(v\) 點的 ​<code>​cxr​</code>​ 家(我們也不知道他要去幹什麼),求所有從 \(u\) 到 \(v\) 的路徑中的必經點。

介紹完上面的圓方樹後,就會發現這題很簡單,必經點個數其實就是兩點之間割點的個數。

其實就是上面這條定理:

得出,必經點數等于圓方樹上兩點路徑上圓點數。

由于圓方樹上任意一條路徑上圓點方點間隔分布,是以需要除以 \(2\)。

直接跑一邊點雙。

再建圖。

然後跑一邊樹鍊剖分,記錄深度和最近公共祖先。

對于每一組詢問,直接用樹上差分的知識求解就行了。

即設 \(lca\) 為 \(u\) 和 \(v\) 的最近公共祖先,則 \(Ans=(dep_u+dep_v-2*dep_{lca}) \div 2+1\)。

閱讀時請省略前面的快讀。