好吧實際上和樹剖沒什麼關係。。只是用來求lca的。。。
對於點x,如果不在環中,定義它的父親為dfs樹中的父親;否則定義它的父親為它所在環在dfs樹中最高的點,同時距離為它到那個最高點的最短路。然後可以用樹剖求出(x,y)的lca。然後分類討論一下,因為如果x->lca和y->lca的路徑上最後一部分在乙個環中,那麼可能可以有另一種走法。
ac**如下:
#include#include#define n 10005
#define m 100005
using namespace std;
int n,m,cas,dfsclk,cnt,tot=1,pnt[m],len[m],nxt[m];
int mrk[n],fa[n],anc[n],d[n],val[n],last[n],blg[n],sz[n],son[n],sum[n];
struct graph
}g1,g2;
void dfs1(int x) else if (mrk[y]>mrk[x])
sum[cnt]=tmp; blg[x]=cnt;
for (y=pnt[p]; y!=x; y=pnt[last[y]^1])
g2.add(x,y,min(val[y],tmp-val[y]));
} }}void dfs2(int x)
}void divide(int x,int tp)
}int lca(int x,int y) else printf("%d\n",d[x]+d[y]-(d[z]<<1));
} }return 0;
}
by lych
2016.5.12
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最短路 初識圓方樹
sto sto sto yyb orz orz orz bzoj2125 非許可權 不知道圓方樹應該歸在資料結構還是圖論,先放在這裡,圓方樹,對於狹義圓方樹,可以解決一類仙人掌的問題。對於仙人掌的定義,通俗來講就是對於乙個無向圖每一條邊有且僅僅被乙個環所包含 最後看起來就像是乙個乙個環圈圈,最終ju...