BZOJ2125 仙人掌 最短路

2021-07-26 20:52:37 字數 1032 閱讀 2275

題意

求仙人掌上的多元最短路

考慮如果在樹上,u,v兩點之間的最短路為dis[u]+dis[v]-2*dis[lca]。

因為仙人掌每個點只屬於乙個簡單環,先dfs弄清仙人掌的結構,對於環把環中離根節點最近的點作為父親,環中其他點向這個點連邊,這樣就建出一棵新的樹,如果u,v的lca不在環上,就按照樹的做法做,如果在環上,因為有兩條鏈,取短的鏈就可以了。

#include 

#include

#include

#include

#include

#include

#define n 20010

using

namespace

std;

int n,m,q,x,y,w,cnt,ans,u,v;

int g[n],fa[n][25],vis[n],dpt[n],dis[n],tot[n],sum[n],bel[n];

struct edgee[n<<4];

queue

q;inline

void read(int &x)

inline

void insert(int x,int y,int w)

void dfs(int x,int f)

tot[cnt]=sum[x]-sum[e[i].t]+e[i].w;}}

}void dfsx(int x,int f)

inline

void spfa()

}}int main()

spfa();

cnt=0; memset(vis,0,sizeof(vis)); dfs(1,0);

cnt=0; memset(g,0,sizeof(g));

for(int i=1;i<=n;i++) insert(i,fa[i][0],0);

dfsx(1,0);

while(q--)

else

printf("%d\n",ans);

}}

BZOJ2125 仙人掌 最短路

bzoj2125 建出圓方樹,圓方邊的權值為圓點到環上最高點在dfs樹上的點的距離,這樣就可以記錄下環上兩個點的距離 並在方點處記錄一下環的總長,因為環上兩點間有兩條路徑可走,要分類討論 然後就是樹上求dis的問題,先求lca 然後lca如果是圓點就直接求距離 如果是方點就分類討論一下就好了 cod...

仙人掌最短路 BZOJ 2125 最短路

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

BZOJ2125 最短路 仙人掌最短路

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