日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 834. 树中距离之和(树上DP)*

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 834. 树中距离之和(树上DP)* 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給定一個無向、連通的樹。樹中有 N 個標記為 0...N-1 的節點以及 N-1 條邊 。

第 i 條邊連接節點 edges[i][0] 和 edges[i][1] 。

返回一個表示節點 i 與其他所有節點距離之和的列表 ans。

示例 1: 輸入: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]] 輸出: [8,12,6,10,10,10] 解釋: 如下為給定的樹的示意圖:0/ \ 1 2/|\3 4 5我們可以計算出 dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5) 也就是 1 + 1 + 2 + 2 + 2 = 8。 因此,answer[0] = 8,以此類推。 說明: 1 <= N <= 10000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sum-of-distances-in-tree
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 抄的官方答案
class Solution {vector<int> ans, son, dp;vector<vector<int>> g; public:vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {ans.resize(N);son.resize(N);dp.resize(N);g.resize(N);for(auto& e : edges){g[e[0]].push_back(e[1]);g[e[1]].push_back(e[0]);}dfs1(0, -1);//dp 初始化dfs2(0, -1);//dp 遞推return ans;}void dfs1(int u, int f){ //求子樹包含的節點數量// 第一次dfs 得到的每個節點子樹節點到該節點的距離和son[u] = 1;dp[u] = 0;for(auto v : g[u]){if(v == f)continue;dfs1(v, u);dp[u] += dp[v]+son[v];//子節點的距離和 + 邊被占用次數son[u] += son[v];}}void dfs2(int u, int f){ans[u] = dp[u];for(auto v : g[u]){if(v == f)continue;int dpu = dp[u], dpv = dp[v];//記錄狀態int sonu = son[u], sonv = son[v];dp[u] -= dp[v]+son[v];//跟換根節點為 v ,u 變成子節點son[u] -= son[v];dp[v] += dp[u]+son[u];// v 加上 u 的數據son[v] += son[u];dfs2(v, u);dp[u] = dpu, dp[v] = dpv;//回溯狀態son[u] = sonu, son[v] = sonv;}} };

148 ms 26.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 834. 树中距离之和(树上DP)*的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。