小a這次來到乙個景區去旅遊,景區裡面有n個景點,景點之間有n-1條路徑。小a從當前的乙個景點移動到下乙個景點需要消耗一點的體力值。但是景區裡面有兩個景點比較特殊,它們之間是可以直接坐觀光纜車通過,不需要消耗體力值。而小a不想走太多的路,所以他希望你能夠告訴它,從當前的位置出發到他想要去的那個地方,他最少要消耗的體力值是多少。
177449
?type=
101&order=
0&pos=
7&page=
1這張圖可以認為是邊權全為1的樹上增加了一條邊權為0的邊。
首先先不考慮多出來的一條邊,那麼dep[u]表示點u的深度,任意兩點u,v的最短的距離就是
dep[u]
+dep[v]−2dep[
lca(u,v)],
加上這條邊後另外一種可能最短的路徑就是經過這條邊權為0的邊,可以建圖之後跑一次最短路,每次查詢的答案都是
min(dis[u]
+dis[v]
,dep[u]
+dep[v]−2dep[
lca(u,v)])。
#include
using
namespace std;
const
int maxn =
2e6+5;
int head[maxn]
, tot;
struct edge edge[maxn]
;int father[maxn]
, depth[maxn]
, size[maxn]
, son[maxn]
, top[maxn]
;int l[maxn]
, r[maxn]
, index;
void
init()
void
add(
int u,
int v)
void
dfs1
(int u,
int fa)
dfs1
(to, u)
; size[u]
+= size[to];if
(size[to]
> maxson)}}
void
dfs2
(int u,
int topf)
for(
int i = head[u]
; i !=-1
; i = edge[i]
.next)
dfs2
(to, to);}
r[u]
= index;
}int
lca(
int x,
int y)
x = father[top[x]];
}if(depth[x]
> depth[y]
)return x;
}int
main()
dfs1(1
,1);
dfs2(1
,1);
int a, b, c;
scanf
("%d%d"
,&a,
&b);
int x, y;
scanf
("%d"
,&m)
;for
(int i =
1; i <= m; i++
)return0;
}
牛客練習賽13 F 皇后
在乙個n n的西洋棋棋盤上有m個皇后。乙個皇后可以攻擊其他八個方向的皇后 上 下 左 右 左上 右上 左下 右下 對於某個皇后,如果某乙個方向上有其他皇后,那麼這個方向對她就是不安全的。對於每個皇后,我們都能知道她在幾個方向上是不安全的。現在我們想要求出t0,t1,t8,其中ti表示恰有i個方向是 ...
牛客小白月賽13 D題
位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?思路 預處理了一下字首l陣列和字尾r陣列,然後列舉那個不選的數就可以了,每次更新ans max ans,l i 1 r i ...
牛客網 小白月賽13 B題
示例1 輸入dcbaabc輸出7說明 將前面的dcba移動到末尾變成abcdcba,這個字串的最大回文子串就是它本身,長度為7備註 n表示字串的長度,1 n 5000n表示字串的長度,1 n 5000本題呢,難就難在manacher 馬拉車 演算法,我也不是特別清楚,馬拉車演算法 就是在補題的時候稍...