有一天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孩子節點也要變, 之後要用到。
病毒感染監測
include include include using namespace std s的第乙個字元和t比較,不相等就和第二個比較,如果一旦有不相等的就繼續比較,設定乙個標記,如果一直沒有就更新一下s的順序 void change string s,int count s length 1 a c...
牛客病毒感染
b.病毒感染 題意 給出一顆所有路徑都為1的樹,讓你找出到其餘點距離和最小的點,若存在多個,都輸出。暴力法 跑n邊迪傑斯特拉,n 5e5,顯然不行。試著畫圖模擬找思路 上圖中,1到其餘各點的距離和為7 1 1 1 1 1 2 2到其餘各點的距離和為10 1 1 2 2 2 2 因為題目保證了各路徑長...
JSOI2016病毒感染
1.題目大意 有1 n的村莊,每個村莊在不 的情況下每天死 a i 人,到達乙個村莊可以 或跳過,若跳過,再回頭時只能一直走回這個村莊,然後才能重新往前走,求最少死亡人數。2.題目分析 我們定義f i 為前 i 個村莊全部治好的最小代價。令j i,在 1 i 內列舉回頭點,因此我們再定義乙個 g i...