給你一棵每條邊均為1的樹,求任意兩點距離乘兩端點中大的那個數的乘積最大為多少?
題意轉化為公式就是求dis
[x][
y]∗m
ax(a
[x],
a[y]
)dis[x][y]*max(a[x],a[y])
dis[x]
[y]∗
max(
a[x]
,a[y
])那麼難點就在於求任意兩點間的距離了。
這時候要抓住條件:這是一棵樹!
利用樹的直徑的性質dfs三次即可。
樹的直徑:若樹上兩點u,v
u,vu,
v間的最短路徑最大,那麼該路徑的長度稱為樹的直徑。(可以存在多條)
我們寫乙個dfs,返回值為到給定點 k
kk 的最遠點的結點編號,並用乙個陣列記錄所有點到點 k
kk 的最短路徑為多少。
我們先對任意乙個點 i
ii 進行dfs,記錄他的返回值為 x
xx ,有上述性質可知 x
xx 一定為到樹的直徑中的乙個端點,我們同時記錄了到 i
ii 的距離放入陣列 dxdx
dx中。我們再對 x
xx 進行一次dfs,記錄他的返回值y
yy,記錄到 x
xx 的距離記錄到陣列 dxdx
dx中。最後對y
yy進行一次dfs,記錄它的返回值 x
xx,記錄到 y
yy 的的距離到陣列 dydy
dy中。之所以求三次dfs是因為第一次的距離是沒法使用的。求端點的話兩次dfs就夠了
c++陣列(指標)作為函式引數
#include
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int>p;
const
double eps =
1e-8
;const
int ninf =
0xc0c0c0c0
;const
int inf =
0x3f3f3f3f
;const ll mod =
1e9+7;
const ll maxn =
1e6+5;
const
int n =
5e5+5;
int n,a[n]
,dx[n]
,dy[n]
;vector<
int>g[n]
;int
dfs(
int x,
int pre,
int*d)
}return res;
}int
main()
int x=
dfs(1,
-1,dx)
;memset
(dx,0,
sizeof
(dx));
int y=
dfs(x,-1
,dx)
; x=
dfs(y,-1
,dy)
; ll ans=0;
for(
int i=
1;i<=n;i++
) ans=
max(ans,
(ll)
max(dx[i]
*max
(a[i]
, a[x]
), dy[i]
*max
(a[i]
, a[y]))
);cout<
'\n'
;return0;
}
杭州學軍中學信友隊「趣味網路邀請賽」遊記
活動 杭州學軍中學信友隊 趣味網路邀請賽 公告 學軍信友隊趣味網路邀請賽,登入 共設5題。由學軍中學信友隊在校五個國家集訓隊員精心原創出題。分5種型別題 a b c d e,從淺至深編排。每題均為100分。a型題 要求掌握條件結構 迴圈結構 陣列 遞迴等程式設計基礎知識,入門級水平 b型題 要求掌握...
學軍信友隊趣味網路邀請賽 D 抗疫鬥爭
時間限制 2000ms 空間限制 512mb 新冠疫情爆發以來,病毒不斷地擴散傳播,而人類也在不斷採取各種措施遏制病毒傳播。於是我們可以為這場抗疫鬥爭建立乙個數學模型,將病毒的不斷傳播和人類的不斷採取措施抽象為一場雙方輪流行動的博弈。我們認為人類與病毒的每輪行動都可以選擇乙個正整數作為行動值來評估。...
杭州學軍中學信友隊 趣味網路邀請賽 總結
2019年末,新型冠狀病毒疫情爆發 數以千計的生命溘然長往 但是我們同舟共濟 鐘 聲激越,決勝千 李 事不避難,捨我其誰 在抗疫英雄們的帶領下 在偉大人民的奮鬥中 建起了堅實的壁壘,扼住了疫情的咽喉 清明之際,向 投身於新冠病毒抗爭中的戰士和烈士們 致敬by xj 總的來說,這次比賽有點尬。t1t2...