圓方樹大概分兩種,一個是圓方樹,一個是廣義圓方樹。
圓方樹
這可以解決仙人掌上的問題。
任意一條邊至多隻出現在一條簡單迴路的無向連通圖稱為仙人掌。
很多題解將其作為無向圖構建,本文將其構建為外向樹,在這個問題中兩種構建方式不會影響求解。
構建方式
記讀入的圖為原圖,構建的圓方樹為新圖。
首先,新圖保留著原圖的點集,這些點記為圓點。
將原圖任意一個點(實現中指定 \(1\) 號點即可)作為根節點,然後在原圖跑一遍 dfs。
每當找到一個環的時候,將進入環的點(也就是邊雙的根節點)記為頭節點,然後在新圖上對加一個方點,並讓頭節點向這個方點連邊,邊權為 \(0\),同時,方點向其它點 \(u\) 連邊,邊權為原圖中的 \(u\) 到頭節點的最短距離。
下面使原圖與對應新圖(圓方樹)的一個例子: