牛客演算法周周練13 B 病毒感染 換根dp

2021-10-08 01:28:03 字數 2201 閱讀 7081

有一天clccle和rqy走在某個國家的街頭上,機智的rqy卻發現周圍的行人不太對勁,他們嘴裡念念有詞,說著"sqn tql!",一邊漫無目的的行走,clccle也發現了這一點,卻驚訝的發覺這種奇怪的病毒會向周圍的城市,最終會感染整個國家,因為網路已經崩潰,所以她們忘記了自己所在的城市,她們唯一知道的是這種病毒是從當前她們所在的城市開始傳播的,並且這個國家的所有城市到這個城市的距離和最小(所有道路的距離都為1),現在給定聰明的你一張整個國家的地圖,請你幫rqy和clccle找到她們現在可能在這個國家的哪乙個城市.

輸入描述:

兩個整數n,m,代表這個國家一共有n個城市,城市之間只有m條道路

接下來m行,每行兩個整數a,b代表城市a,b之間有一條聯通的道路

輸出描述:

多個整數,輸出當前clccle和rqy可能所在的點

示例1輸入

複製

2 1

1 2

輸出

複製

1 2

備註:

對於所有的資料,1<=m<=n<=50000

(圖的型別保證沒有大小大於等於3的環)

這個沒有大於等於3的環也就相當於是環, 基本上可以看成數,

題目意思相當於求每個點到其他所有點的最短距離之和,然後再看看哪些點最小 , 直接換根dp 求 每個點

dp[u] 表示u點到所有其他所有點的最短距離之和

第一次dfs的時候從下向上傳遞 , 此時dp[u]表示u點到子樹中所有點的最短距離之和 , x節點對當前節點的貢獻是 dp[x] + size[x] , 其含義在孩子節點x的基礎上面,所有的子節點全部深度全部加一 , 也就是 + size[x]從上到下傳遞的時候,當前節點u對孩子節點的貢獻是 dp[u] - dp[x] - size[x] + size[u] - size[x] ,解釋: 先將當前節點的dp[u] 剪掉 所要傳孩子節點x的dp[x] 貢獻刪掉, 根據第一步 , 其貢獻是dp[x] + size[x] , size[u] 要減掉size[x] , 這兩個dp[u] - dp[x] - size[x] , 和 size[u] - size[x] , 都相當於在下傳貢獻的時候, 先將孩子節點的貢獻刪掉 , 然後將孩子節點數量改變一下,因為下一次x節點就變成了根節點 , dp值要變, size孩子節點也要變, 之後要用到。

牛客演算法周周練13

a 最小生成樹 小 a 有一張 n 個點的帶權無向圖,這張無向圖非常特別,首先第 i 個點有乙個點權 ai,之後這張無向圖是一張完全圖,且邊 u,v 的權值為 au 現在小 a 想找乙個這張圖的邊權之和最小的生成樹,需要你來幫幫他 題解 每個點都和最小那個點連線形成的樹即最小生成樹 注意 使用長整形...

牛客演算法周周練13水題

powered by ab in 局外人 貪心演算法,最小的數當父節點,其他數均為子節點。n int input a list map int input split a.sort print sum a a 0 n 2 依然是貪心,把獲得半價的權力給 高的即可。include pragma gcc...

牛客演算法周周練2

a 題意 求乙個數的順序和逆序之和。題解 其實就是個閹割版的高精度加法嘛。其實逆序數忽略前導零這個條件是沒有用的,因為順序數不可能有前導零,自然結果也不會有,然後注意下首位進製不取餘。include using namespace std int a 10 b 10 intmain for k j ...