顯然使a到b的最長邊最小的路徑一定在最小生成樹上,否則一定可以使生成樹更小。
求出原圖的最小生成樹,然後用倍增求路徑上最大值就可以了。
**:
1 #include2 #include3 #include4 #include5bzoj3732using
namespace
std;
6#define n 15010
7#define s 15
8struct
edge
11 edge(int f,int t,int
w):f(f),t(t),w(w){}
12bool
operator
< (edge a)const
15 }e[n<<1
],tmp;
16 priority_queueq;
17int
d[n],i,j,k,x,y,z,n,m,num,h[n],f[n][s],max[n][s];
18 inline int _max(int x,int y)
19 inline void add(int x,int y,int
z)22 inline int find(int x)
23 inline void dfs(int x,int
f)28 inline int query(int x,int
y)38
intmain()
3948 dfs(1,0
);49
for(j=1;j)
50for(i=1;i<=n;i++)
51 f[i][j]=f[f[i][j-1]][j-1],max[i][j]=_max(max[i][j-1],max[f[i][j-1]][j-1
]);52
while(k--)
56return0;
57 }
bzoj3732 最小生成樹 倍增
顯然使a到b的最長邊最小的路徑一定在最小生成樹上,否則一定可以使生成樹更小。求出原圖的最小生成樹,然後用倍增求路徑上最大值就可以了。1 include2 include3 include4 include5 using namespace std 6 define n 15010 7 define ...
HYSBZ 3732 最小生成樹 倍增Lca
題目 碼了乙個星期終於過了這一題。渣是原罪.最小生成樹 倍增lca 思路不難,但這是我第一次寫lca的題目。下面一步步來解釋這題。題意 給你m條無向邊,有k個查詢,問從a到b所有路徑上的最長邊的最小值。首先,從a到b所有路徑上的最長邊的最小值所對應的邊一定在最小生成樹上。為什麼?現在來回憶一下kru...
bzoj 4242 水壺 最小生成樹 樹上倍增
為了降低ac率 這道題目我各種花樣作死爆oj,最後還是和標算改得差不多了。顯然答案應該為建築物構成的最小生成樹中,兩點間的最大路徑 那麼只要得到這棵最小生成樹就可以用倍增在o qlogn 的時間內得到答案了。因此關鍵是求最小生成樹。注意到是平面圖,因此考慮用bfs求最小生成樹。直接以每個建築為原點拓...