BZOJ2125最短路 初識圓方樹

2022-09-10 00:30:35 字數 1717 閱讀 3060

sto sto sto %%%yyb%%% orz orz orz

bzoj2125(非許可權)

不知道圓方樹應該歸在資料結構還是圖論,,先放在這裡,,

圓方樹,對於狹義圓方樹,可以解決一類仙人掌的問題。對於仙人掌的定義,通俗來講就是對於乙個無向圖每一條邊有且僅僅被乙個環所包含(最後看起來就像是乙個乙個環圈圈,最終just like乙個仙人掌。(網上有很多仙人掌的orz)

圓方樹的結點分為方點和圓點,圓點就是原圖上的點,方點是我們新構建出來的點,對於一張原圖,有幾個環(點雙連通分量,因此圓方樹也被稱為點雙樹),就有幾個方點。對於新圖,所有環上的點都與這個環對應的方點相連,而對於不在同乙個環上連線圓點的邊,我們在新圖中直接相連。因此,最終圖的樣子看起來就像一朵一朵的菊花相連(霧)。

對於方點與方點之間不會有邊相連,即只存在圓點與方點的邊和圓點和圓點之間的邊。最後我們構造出來的新圖一定是一棵無根樹(顯而易見)。

發現點雙連通分量,我們可以想到tarjan,對,我們利用tarjan一邊就將新圖建出來了,同時我們對於圓點到圓點邊的距離就是就是原圖邊的距離,對於圓點到方點的距離定義為這個點到環上在tarjan的dfs樹上的深度最淺的那個點的最短距離,同時記錄這個最短距離是不是經過dfs樹上祖先樹上來的還是返祖邊來的,同時將每個環的環長記錄下來。

那麼我們轉回到這道題上來。這道題找的是在仙人掌上求兩點之間的最短路。那麼我們想到建立圓方樹後,我們對於普通的樹上兩點求距離就是dis[x]+dis[y]-2dis[lca],同理圓方樹我們用樹剖用倍增求lca都是可以的。如果對於兩點,他們的lca在圓點上,那麼就是dis[x]+dis[y]-2dis[lca]如果他們的lca在方點上,說明他們之間的路徑一定是經過了環且這個環就是這個方點對應的環。

那麼我們利用樹剖跳跳跳,或者利用倍增 跳跳跳,使得他們跳到同lca的乙個環上。對於乙個環上的兩個點在環上的最短距離即他們可以走兩條路,我們利用dis和是否經過返祖邊最終可以很好搞出在同乙個環上的兩點之間的距離。

具體在同乙個環上兩點x,y距離:我們將x和y的dis[x]和dis[y]利用之間的記錄和環的長度,得到一定走返祖邊的距離,兩個相減取abs得其中一條路距離,最終min(環長-一條路距,一條路距)

於是就這麼搞出來啦!

/*

tarjan建圓方樹,圓點到方點的距離表示到樹上深度最淺的點的距離

(同時記錄搞這個距離是否經過返祖邊

樹剖,如果lca在圓點上則與樹上最短距離相同

lca在方點上表示這兩個點的祖先有兩個(在乙個仙人掌上)

先跳到同乙個仙人掌上,然後亂搞就好了

*/ #include#include#include#include#include#includeusing namespace std;

const int maxn = 200005;

const int maxm = 500005;

int n,m,q; int tot;

struct line;

struct tu

; la[a]=cnt;

lin[++cnt]=(line); la[b]=cnt;

}}g,v;

struct yfs

} void dfs2(int x,int ace) }

int getlca(int x,int y) }

int main()

tarjan(1,0); z.dfs1(1,0); z.dfs2(1,1);

for(int i=1;i<=q;i++)

}

BZOJ2125 最短路 圓方樹

思路 關於靜態仙人掌的問題,建立出圓方樹比較好求解。求出來之後處理每個圓點方點的情況,原來的是樹邊直接處理,環邊的話方點連向環上每個圓點一條邊,權值為每個節點到環的父親節點的最短距離。然後倍增預處理,查詢的時候,如果lc a lca 是圓點直接輸出,否則兩個點是環上的點,處理他們在環上的最短距離即可...

bzoj2125 圓方樹 最短路

description 給乙個n個點m條邊的連通無向圖,滿足每條邊最多屬於乙個環,有q組詢問,每次詢問兩點之間的最短路徑。input 輸入的第一行包含三個整數,分別表示n和m和q 下接m行,每行三個整數v,u,w表示一條無向邊v u,長度為w 最後q行,每行兩個整數v,u表示一組詢問 output ...

BZOJ2125 最短路 圓方樹 倍增LCA

最短路 做法 本題需要用到圓方樹來處理仙人掌。題目中所給的圖稱作仙人掌圖,即每條邊至多在乙個環上的圖。對於這種圖,我們一般把它轉化成樹後,將樹上的某些演算法修改後來解決仙人掌上的問題。常用的一種轉化方式就是圓方樹。在圓方樹中,乙個圓點表示原仙人掌中就有的點,而乙個方點表示乙個點雙連通分量 環 並且乙...