題目描述
rinne 最近了解了如何快速維護可支援插入邊刪除邊的圖,並且高效的回答一下奇妙的詢問。
她現在拿到了乙個 n 個節點 m 條邊的無向連通圖,每條邊有乙個邊權 wi
現在她想玩乙個遊戲:選取乙個 「重要點」 s,然後選擇性刪除一些邊,使得原圖中所有除 s 之外度為 1 的點都不能到達 s。
定義刪除一條邊的代價為這條邊的邊權,現在 rinne 想知道完成這個遊戲的最小的代價,這樣她就能輕鬆到達 rk1 了!
作為回報,她會讓你的排名上公升一定的數量。
輸入描述:第一行三個整數 n,m,s,意義如「題目描述」所述。
接下來 m 行,每行三個整數 u,v,w 代表點 u 到點 v 之間有一條長度為 w 的無向邊。
輸出描述:乙個整數表示答案。
示例1
輸入
4 3 1
1 2 1
1 3 1
1 4 1
輸出
3
示例2
輸入
4 3 1
1 2 3
2 3 1
3 4 2
輸出
1
備註:2≤s≤n≤10e5,m=n−1,保證答案在 c++ long long 範圍內。
題解部分
今天是第一次寫題解,也是第一次在牛客每日一題上做對一道題,大家多多關照。
這道題是一道樹上dp
注意題目條件,m = n - 1在暗示我們這是一顆樹,所以除 s 之外度為 1 的點就是以s為根的葉節點
題目就是讓我們求刪去最少權值的邊來讓s和葉節點不連通
若我們設f[x]表示以x為子樹中葉節點與s不連通需要的最小代價,所以f[x] = min(f[y],len[x][y])
其中y表示x的兒子,len[x][y]表示x到y的距離
注意,f[x]要加上兒子的最小代價和
附上**(我沒開long long竟然過了)
#include using namespace std;
const int maxn = 3e5 + 5;
int last[maxn],next[maxn],len[maxn],end[maxn],cnt,f[maxn];
void add(int x,int y,int z)
int dfs(int x,int fa)
}return ans;
}int main()
dfs(s,0);
printf("%d", f[s]);
return 0;
}
祝大家a題愉快 牛客每日一練(2018 10 20)
1 給定二進位制字串,將其換算成對應的十進位制數字 時間限制 3秒 空間限制 32768k 熱度指數 13677 function base10 str parseint方法可以將其它進製轉換為十進位制,只需要給該方法傳入需要轉換的字串和該字串的進製表示兩個引數即可。ps parseint 返回的是...
數碼 牛客每日一題
題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...
牛客網 每日一練
param n int整型 return int整型 class solution defnumtrees self n dp 0 for i in range n 1 dp 0 1dp 1 1 for j in range 2,n 1 for k in range 1,j 1 dp j dp j ...