BZOJ 2125 最短路 仙人掌 圓方樹

2022-04-02 17:04:07 字數 1030 閱讀 7811

題目鏈結

題意:q次詢問仙人掌上兩點的最短路。

圓方樹。做題思路不寫了。。

就是當lca是方點時跳進那個環可以分類討論一下用樹剖而不必須用倍增:

如果v是u的(唯一的那個)重兒子,那麼u的dfs序上+1的點即是要找的;否則v會引出一條新的鏈。

不用圓方樹的做法(**錯了不想改了,但是能a)。

//3876kb	148ms(rank6!)

#include #include #include //#define gc() getchar()

#define maxin 50000

#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)

const int n=10005<<1,m=n<<2;//點數!(方點)

int n,m,q,tot,index,dfn[n],low[n],fa[n],dis[n],cdis[n],sz[n],son[n],dep[n],top[n],ref[n],cnt;

char in[maxin],*ss=in,*tt=in;

struct edge

}g,t;

inline int read()

void build(int u,int v,int d)//v->...->u->v

void tarjan(int x)

for(int v,i=g.h[x]; i; i=g.nxt[i])

if(fa[v=g.to[i]]!=x && dfn[v]>dfn[x]) build(x,v,g.val[i]);//square point

}void dfs1(int x)

}void dfs2(int x,int tp)

}int lca(int u,int v)

int get_p(int u,int lca)

int main()

return 0;

}

BZOJ2125 仙人掌 最短路

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

BZOJ2125 仙人掌 最短路

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

仙人掌最短路 BZOJ 2125 最短路

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