【每日一题】4月1日题目 Rinne Loves Edges
牛客網
鏈接:https://ac.nowcoder.com/acm/problem/22598
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format:%lld
題目描述 Rinne 最近了解了如何快速維護可支持插入邊刪除邊的圖,并且高效的回答一下奇妙的詢問。 她現在拿到了一個 n 個節點 m
條邊的無向連通圖,每條邊有一個邊權 wi 現在她想玩一個游戲:選取一個 “重要點” S,然后選擇性刪除一些邊,使得原圖中所有除 S 之外度為
1 的點都不能到達 S。 定義刪除一條邊的代價為這條邊的邊權,現在 Rinne 想知道完成這個游戲的最小的代價,這樣她就能輕松到達 rk1
了!作為回報,她會讓你的排名上升一定的數量。
輸入描述:
第一行三個整數 N,M,S,意義如「題目描述」所述。
接下來 M 行,每行三個整數 u,v,w 代表點 u 到點 v 之間有一條長度為 w 的無向邊。
輸出描述:
一個整數表示答案。
示例1
輸入
輸出
3說明
需要使得點 2,3,4 不能到達點 1,顯然只能刪除所有的邊,答案為 3
示例2
輸入
輸出
1說明
需要使得點 4 不能到達點 1,顯然刪除邊 2?3是最優的。
備注:
2≤S≤N≤105,M=N?1保證答案在 C++ long long 范圍內
仔細觀察題中給的數據m=n-1,其實就是給你一個樹,而被刪除度為1的點就是這個樹的葉子節點,給你的s就是這個樹的根
那一切就很清楚了:給你一個樹和根節點,讓你通過刪邊使得根節點與葉子節點不相連,問你怎么刪值最小
這個是樹形dp問題,我們要做的就是在搜索樹的過程中不斷處理數據
凡是dp問題,都有狀態轉移,就是一個大問題可以小問題
s為根節點時,要刪去一些邊讓s與每個葉子節點不連通,其實就是讓x為根節點的子樹刪去一些邊,使得s和x的子樹上每個葉子節點不連通。
兩種情況:一個就是刪去x與他兒子y的邊
另一個就是看以y為子樹的根節點的最小情況。
我們取較小值
f[x]+=min(f[y],edge[i].w);
edge[i].w是指當前節點x與其子節點y的距離
具體看代碼吧
總結
以上是生活随笔為你收集整理的【每日一题】4月1日题目 Rinne Loves Edges的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冰淇淋甜点怎么做 冰淇淋甜点的制作方法教
- 下一篇: 【每日一题】4月6日数码