BZOJ2125 仙人掌 最短路

2021-09-25 15:06:54 字數 1535 閱讀 9685

bzoj2125

建出圓方樹,圓方邊的權值為圓點到環上最高點在dfs樹上的點的距離,這樣就可以記錄下環上兩個點的距離

並在方點處記錄一下環的總長,因為環上兩點間有兩條路徑可走,要分類討論

然後就是樹上求dis的問題,先求lca

然後lca如果是圓點就直接求距離

如果是方點就分類討論一下就好了

code:

#include

using

namespace std;

inline

intread()

while

(isdigit

(ch)

)return res*f;

}const

int n=

2e4+5;

struct e

}tar,tr;

int tot,len[n]

,d[n]

,stk[n]

,lst[n]

,dfn[n]

,low[n]

,top,pt[n]

,sign=0;

inline

void

build

(int v,

int k)

while

(x!=k)

; tr.

add(v,tot,0)

;}void

tarjan

(int v,

int f)

else low[v]

=min

(low[v]

,dfn[y]

),lst[v]

=tar.c[i];}

}int fa[n][16

],sum[n][16

],dep[n]

;void

dfs(

int v)

}int n;

inline

intlca

(int u,

int v)

int m,q;

intmain()

tarjan(1

,0);

dfs(1)

;for

(int j=

1;j<=

15;j++

)for

(int i=

1;i<=tot;i++

) fa[i]

[j]=fa[fa[i]

[j-1]]

[j-1

],sum[i]

[j]=sum[i]

[j-1

]+sum[fa[i]

[j-1]]

[j-1];

for(

int x,y,i=

1;i<=q;i++

) x=

read()

,y=read()

,cout<<

lca(x,y)

<<

"\n"

;return0;

}

BZOJ2125 仙人掌 最短路

題意 求仙人掌上的多元最短路 考慮如果在樹上,u,v兩點之間的最短路為dis u dis v 2 dis lca 因為仙人掌每個點只屬於乙個簡單環,先dfs弄清仙人掌的結構,對於環把環中離根節點最近的點作為父親,環中其他點向這個點連邊,這樣就建出一棵新的樹,如果u,v的lca不在環上,就按照樹的做法...

仙人掌最短路 BZOJ 2125 最短路

題解 首先如果這是一棵樹的話,那麼我們只需要選定乙個根,之後掃一遍這棵樹,詢問的話即是兩點到根節點的距離之和減去二倍的兩點lca到根節點距離。那麼如果是一棵仙人掌的話,我們強行套用這個辦法,重新構造一棵樹。對於仙人掌中的乙個環來說,我們把該環中深度最小的點當做這個環的根,然後環上其他點連向該環,非環...

BZOJ2125 最短路 仙人掌最短路

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