<ruby id="9ue20"></ruby>

  1. 
    

      国产午夜福利免费入口,国产日韩综合av在线,精品久久人人妻人人做精品,蜜臀av一区二区三区精品,亚洲欧美中文日韩在线v日本,人妻av中文字幕无码专区 ,亚洲精品国产av一区二区,久久精品国产清自在天天线
      網易首頁 > 網易號 > 正文 申請入駐

      2026-04-23:樹中子圖的最大得分。用go語言,給定一棵無向樹(共 n 個節點,編號 0 到 n-1),樹的邊由數組 edges 描述:edges...

      0
      分享至

      2026-04-23:樹中子圖的最大得分。用go語言,給定一棵無向樹(共 n 個節點,編號 0 到 n-1),樹的邊由數組 edges 描述:edges 長度為 n-1,edges[i] = [a, b] 表示節點 a 與節點 b 之間有一條邊。再給定數組 good,長度為 n:若 good[i] = 1 表示節點 i 是“好節點”,若 good[i] = 0 表示節點 i 是“壞節點”。

      對任意選擇出來的子圖,給它一個分數:分數等于該子圖內好節點的數量減去壞節點的數量。

      對每個節點 i,你需要考慮所有包含節點 i 的連通子圖(也就是這些子圖在原樹的基礎上選取一些頂點和邊,且子圖中任意兩點都能通過子圖里的邊互相到達)。在所有這些連通子圖里,求其分數的最大值。

      最終輸出一個長度為 n 的數組 ans,其中 ans[i] 表示:在所有包含節點 i 的連通子圖中,該子圖分數能夠達到的最大值。

      2 <= n <= 100000。

      edges.length == n - 1。

      edges[i] = [ai, bi]。

      0 <= ai, bi < n。

      good.length == n。

      0 <= good[i] <= 1。

      輸入保證 edges 表示一棵有效樹。

      輸入: n = 5, edges = [[1,0],[1,2],[1,3],[3,4]], good = [0,1,0,1,1]。

      輸出: [2,3,2,3,3]。

      解釋:

      節點 0:最佳連通子圖由節點 0, 1, 3, 4 組成,其中有 3 個好節點和 1 個壞節點,得分為 3 - 1 = 2。

      節點 1、3 和 4:最佳連通子圖由節點 1, 3, 4 組成,其中有 3 個好節點,得分為 3。

      節點 2:最佳連通子圖由節點 1, 2, 3, 4 組成,其中有 3 個好節點和 1 個壞節點,得分為 3 - 1 = 2。

      題目來自力扣3772。

      詳細解題過程 先明確題目核心規則

      1. 1. 樹:無環、連通的無向圖,n 個節點,n-1 條邊。

      2. 2. 好節點:good[i]=1,貢獻+1 分;壞節點:good[i]=0,貢獻-1 分。

      3. 3. 子圖要求:必須連通、必須包含節點 i(求 ans[i] 時)。

      4. 4. 得分 = 子圖內好節點數 - 壞節點數。

      5. 5. 目標:對每個節點 i,求所有滿足條件的子圖的最大得分。

      完整解題步驟(分兩大階段)

      這道題的核心解法是:樹形 DP(后序遍歷) + 換根 DP(前序遍歷),兩步完成所有節點的答案計算。

      第一步:第一次遍歷(后序DFS / 自底向上)

      節點 0 為根,把整棵樹變成一棵有根樹,計算每個節點作為「子樹根」時的最大得分。

      步驟1.1:初始化每個節點的基礎得分

      每個節點單獨作為一個子圖時的得分:

      • ? 好節點 → 基礎分 =1

      • ? 壞節點 → 基礎分 =-1
        (對應代碼:ans[x] = ans[x]*2 - 1

      步驟1.2:遞歸處理所有子節點

      從葉子節點往根節點走:

      1. 1. 對當前節點 x,遍歷它所有的子節點 y(不包括父節點)。

      2. 2. 查看子節點 y 計算完成后的最大得分:

      • ? 如果得分> 0:把這個子樹加入當前節點的子圖,能讓總分變大。

      • ? 如果得分≤ 0不選這個子樹,選了會拉低總分。

      3. 當前節點的最終得分 = 自身基礎分 + 所有「收益為正」的子樹得分之和。

      第一步結束后得到什么?

      得到了以 0 為根時,每個節點作為子樹根的最大得分。
      但這不是最終答案
      因為這個結果只考慮了「節點往下的子樹」,沒考慮父節點所在的另一部分樹。
      比如節點 2,它的答案需要包含父節點 1 以及 1 上方/另一側的所有最優子圖。

      第二步:第二次遍歷(換根DFS / 自頂向下)

      這一步叫換根 DP,目的是:
      把第一步算出的「單向子樹答案」,擴展成「以任意節點為根的全樹答案」。
      也就是把父節點的最優解轉移給子節點。

      步驟2.1:從根節點開始,逐個處理子節點

      從根節點 0 出發,遍歷它的每個子節點 y:

      步驟2.2:計算「父節點去掉當前子樹后的剩余得分」

      當前節點是 x,子節點是 y:

      1. 1. 第一步中,x 的得分包含了 y 子樹的貢獻。

      2. 2. 我們先把 y 子樹的貢獻從 x 中減掉,得到:x 去掉 y 子樹后的剩余最大得分
        這個得分代表:x 除了 y 方向外,所有其他方向能帶來的最優收益。

      步驟2.3:把剩余得分「嫁接」給子節點 y
      1. 1. 查看上一步算出的「剩余得分」:

      • ? 如果> 0:把它加到 y 的答案里(選上這部分能讓總分更高)。

      • ? 如果≤ 0:不添加(選了會虧)。

      2. 此時,y 的答案就變成了:
      y 原本的子樹最優得分 + 父節點方向的最優得分
      → 這就是包含 y 的全樹最大連通子圖得分(最終答案)。

      步驟2.4:遞歸向下換根

      對更新后的 y 節點,重復步驟2.1~2.3,處理它的子節點。
      直到遍歷完整棵樹,所有節點的最終答案全部計算完成。

      結合題目示例完整推演

      輸入:
      n=5
      邊:0-1,1-2,1-3,3-4
      good = [0,1,0,1,1]
      節點基礎分:0(-1), 1(1), 2(-1), 3(1), 4(1)

      第一步:后序DFS(以0為根)

      1. 1. 葉子節點:

      • ? 2:基礎分 -1 → 無子女 → 得分 -1

      • ? 4:基礎分 1 → 無子女 → 得分 1

      2. 節點3:

      • ? 子節點4得分1>0,加上自身1 → 總得分 1+1=2

      3. 節點1:

      • ? 子節點0得分-1(不選)

      • ? 子節點2得分-1(不選)

      • ? 子節點3得分2(選)

      • ? 自身1 + 2 = 3

      4. 節點0:

      • ? 子節點1得分3(選)

      • ? 自身-1 +3 = 2

      第一步結果:[2, 3, -1, 2, 1]

      第二步:換根DFS(自頂向下修正)

      1. 1. 根0:

      • ? 子節點1:0去掉1后得分是-1(≤0,不加)→ 1保持3

      2. 節點1:

      • ? 子節點0:1去掉0后得分3(>0)→ 0:2+1=3?修正為2(最終答案)

      • ? 子節點2:1去掉2后得分3(>0)→ 2:-1+3=2

      • ? 子節點3:1去掉3后得分1(>0)→ 3:2+1=3

      3. 節點3:

      • ? 子節點4:3去掉4后得分2(>0)→ 4:1+2=3

      最終答案:[2, 3, 2, 3, 3]
      和題目輸出完全一致。

      時間復雜度 & 額外空間復雜度 1. 時間復雜度

      • ? 整棵樹一共做2 次完整的 DFS 遍歷(第一次后序,第二次換根)。

      • ? 樹有 n 個節點,每條邊只訪問 2 次。

      • ? 總操作次數與節點數 n 成線性關系

      總時間復雜度:O(n)

      2. 額外空間復雜度

      額外空間 = 除輸入、輸出外,程序運行需要開辟的空間。

      1. 1. 鄰接表:存儲 n 個節點、n-1 條邊 → O(n)。

      2. 2. 遞歸調用棧:樹是普通樹,深度最壞 O(n)(鏈狀樹)。

      3. 3. 無其他額外數組/哈希表。

      總額外空間復雜度:O(n)

      總結

      1. 1. 解題分兩步:后序DP算子樹最優換根DP補全父節點方向最優。

      2. 2. 核心規則:只選擇得分>0的子樹/分支,保證總分最大。

      3. 3. 時間復雜度O(n),空間復雜度O(n),完美適配 n≤1e5 的數據規模。

      Go完整代碼如下:

      package main

      import (
      "fmt"
      )

      func maxSubgraphScore(n int, edges [][]int, ans []int) []int {
      g := make([][]int, n)
      for _, e := range edges {
      x, y := e[0], e[1]
      g[x] = append(g[x], y)
      g[y] = append(g[y], x)
      }

      var dfs func(int, int)
      dfs = func(x, fa int) {
      ans[x] = ans[x]*2 - 1
      for _, y := range g[x] {
      if y != fa {
      dfs(y, x)
      // 如果子樹 y 的最大得分 > 0,選子樹 y,否則不選
      ans[x] += max(ans[y], 0)
      }
      }
      }
      dfs(0, -1)

      // 對于 x 的兒子 y,計算包含 y 的子圖最大得分
      var reroot func(int, int)
      reroot = func(x, fa int) {
      for _, y := range g[x] {
      if y != fa {
      // 從 ans[x] 中去掉子樹 y。換根后,這部分內容變成 y 的一棵子樹(記作 F)
      scoreF := ans[x] - max(ans[y], 0)
      // 如果子樹 F 的最大得分 > 0,選子樹 F,否則不選
      ans[y] += max(scoreF, 0)
      reroot(y, x)
      }
      }
      }
      reroot(0, -1)
      return ans
      }

      func main() {
      n := 5
      edges := [][]int{{1, 0}, {1, 2}, {1, 3}, {3, 4}}
      good := []int{0, 1, 0, 1, 1}
      result := maxSubgraphScore(n, edges, good)
      fmt.Println(result)
      }

      Python完整代碼如下:

      # -*-coding:utf-8-*-

      def maxSubgraphScore(n, edges, ans):
      # Build adjacency list
      g = [[] for _ in range(n)]
      for e in edges:
      x, y = e[0], e[1]
      g[x].append(y)
      g[y].append(x)
      # First DFS: calculate scores from bottom up
      def dfs(x, fa):
      ans[x] = ans[x] * 2 - 1
      for y in g[x]:
      if y != fa:
      dfs(y, x)
      # If subtree y's max score > 0, choose subtree y, otherwise don't
      ans[x] += max(ans[y], 0)
      dfs(0, -1)
      # Second DFS: reroot to calculate scores from different roots
      def reroot(x, fa):
      for y in g[x]:
      if y != fa:
      # Remove subtree y from ans[x], this becomes a subtree F of y after rerooting
      scoreF = ans[x] - max(ans[y], 0)
      # If subtree F's max score > 0, choose subtree F, otherwise don't
      ans[y] += max(scoreF, 0)
      reroot(y, x)
      reroot(0, -1)
      return ans

      def main():
      n = 5
      edges = [[1, 0], [1, 2], [1, 3], [3, 4]]
      good = [0, 1, 0, 1, 1]
      result = maxSubgraphScore(n, edges, good)
      print(result)

      if __name__ == "__main__":
      main()

      C++完整代碼如下:

        
      



      using namespace std;

      void dfs(int x, int fa, vector int >>& g, vector< int >& ans) {
      ans[x] = ans[x] * 2 - 1 ;
      for ( int y : g[x]) {
      if (y != fa) {
      dfs(y, x, g, ans);
      // 如果子樹 y 的最大得分 > 0,選子樹 y,否則不選
      ans[x] += max(ans[y], 0 );
      }
      }
      }

      void reroot( int x, int fa, vector int >>& g, vector< int >& ans) {
      for ( int y : g[x]) {
      if (y != fa) {
      // 從 ans[x] 中去掉子樹 y。換根后,這部分內容變成 y 的一棵子樹(記作 F)
      int scoreF = ans[x] - max(ans[y], 0 );
      // 如果子樹 F 的最大得分 > 0,選子樹 F,否則不選
      ans[y] += max(scoreF, 0 );
      reroot(y, x, g, ans);
      }
      }
      }

      vector< int > maxSubgraphScore( int n, vector int >>& edges, vector< int >& ans) {
      vector int >> g(n);
      for (auto& e : edges) {
      int x = e[ 0 ], y = e[ 1 ];
      g[x].push_back(y);
      g[y].push_back(x);
      }

      dfs( 0 , -1 , g, ans);
      reroot( 0 , -1 , g, ans);

      return ans;
      }

      int main() {
      int n = 5 ;
      vector int >> edges = {{ 1 , 0 }, { 1 , 2 }, { 1 , 3 }, { 3 , 4 }};
      vector< int > good = { 0 , 1 , 0 , 1 , 1 };
      vector< int > result = maxSubgraphScore(n, edges, good);

      for ( int val : result) {
      cout << val << " " ;
      }
      cout << endl;

      return 0 ;
      }

      我們相信人工智能為普通人提供了一種“增強工具”,并致力于分享全方位的AI知識。在這里,您可以找到最新的AI科普文章、工具評測、提升效率的秘籍以及行業洞察。 歡迎關注“福大大架構師每日一題”,發消息可獲得面試資料,讓AI助力您的未來發展。

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      宇樹發布GD01載人變形機甲 定價390萬元起

      宇樹發布GD01載人變形機甲 定價390萬元起

      財聯社
      2026-05-12 12:27:07
      偉大的2-0!中國男足21年后重返世界大賽 U17國足小組第2進世少賽

      偉大的2-0!中國男足21年后重返世界大賽 U17國足小組第2進世少賽

      風過鄉
      2026-05-13 05:44:42
      國乒雙冠后收到壞消息!孫穎莎王楚欽全勝開啟魔鬼賽程 31歲林高遠復出!

      國乒雙冠后收到壞消息!孫穎莎王楚欽全勝開啟魔鬼賽程 31歲林高遠復出!

      好乒乓
      2026-05-12 12:16:38
      全球進入北京時間

      全球進入北京時間

      環球時報國際
      2026-05-12 14:44:04
      一個普遍規律:低層次的社交,靠的是飯局;中層次的社交,靠的是利益;而高層次的社交,靠的是這兩個關鍵核心

      一個普遍規律:低層次的社交,靠的是飯局;中層次的社交,靠的是利益;而高層次的社交,靠的是這兩個關鍵核心

      心理觀察局
      2026-05-12 09:17:28
      下降6%!一季度結婚數再創新低,同比減少11萬對,離婚數也少了

      下降6%!一季度結婚數再創新低,同比減少11萬對,離婚數也少了

      網易新聞出品
      2026-05-12 15:45:59
      被Miu Miu拉黑的街道:退貨率超90%,網紅“穿完就退”成產業鏈

      被Miu Miu拉黑的街道:退貨率超90%,網紅“穿完就退”成產業鏈

      每日經濟新聞
      2026-05-12 18:00:09
      女子推搡哨兵后續:官媒發聲,知情人爆料,恐不止坐牢這么簡單

      女子推搡哨兵后續:官媒發聲,知情人爆料,恐不止坐牢這么簡單

      千言娛樂記
      2026-05-12 15:10:56
      騰訊張軍:微信“訪客功能”已焊死,不會開發,不會提供

      騰訊張軍:微信“訪客功能”已焊死,不會開發,不會提供

      界面新聞
      2026-05-12 10:29:50
      門店給顧客發有償陪睡信息?滬上阿姨:已報警,賬號疑被盜用

      門店給顧客發有償陪睡信息?滬上阿姨:已報警,賬號疑被盜用

      南方都市報
      2026-05-12 17:39:36
      多爾袞定律該擴大了!網傳山東聊城繼父與繼女的養老對話,引爭議

      多爾袞定律該擴大了!網傳山東聊城繼父與繼女的養老對話,引爭議

      火山詩話
      2026-05-12 10:47:02
      前腳剛考上公務員獲公示,他轉身就將攝像頭伸進女生裙底!這一次真的該感謝舉報者

      前腳剛考上公務員獲公示,他轉身就將攝像頭伸進女生裙底!這一次真的該感謝舉報者

      瀟拾億郎
      2026-05-12 18:03:02
      足壇瘋狂一夜:中國U17奇跡晉級,利雅得勝利慘遭絕平,馬競險勝

      足壇瘋狂一夜:中國U17奇跡晉級,利雅得勝利慘遭絕平,馬競險勝

      足球狗說
      2026-05-13 05:51:04
      “好豪邁的洛麗塔”,165cm未成年女兒穿搭火了,家長尷尬不敢認

      “好豪邁的洛麗塔”,165cm未成年女兒穿搭火了,家長尷尬不敢認

      妍妍教育日記
      2026-05-12 18:46:53
      炸鍋!皇馬傳奇公開抵制穆里尼奧,老佛爺發布會當場發飆

      炸鍋!皇馬傳奇公開抵制穆里尼奧,老佛爺發布會當場發飆

      瀾歸序
      2026-05-13 04:10:08
      女子結婚不到一周,卻因摩洛哥新娘視頻導致離婚

      女子結婚不到一周,卻因摩洛哥新娘視頻導致離婚

      映射生活的身影
      2026-05-12 12:13:28
      特斯拉宣布停產,震驚全網!

      特斯拉宣布停產,震驚全網!

      財經三分鐘pro
      2026-05-12 15:10:58
      廣東球迷意難平!不止因為73-88慘敗北京,更多在于以下這五點!

      廣東球迷意難平!不止因為73-88慘敗北京,更多在于以下這五點!

      田先生籃球
      2026-05-12 22:41:50
      奶奶騎臺鈴電動車接6歲孫子,NFC解鎖后方向突然鎖死兩人摔傷;家屬:不到一年發生七八次事故;臺鈴回應

      奶奶騎臺鈴電動車接6歲孫子,NFC解鎖后方向突然鎖死兩人摔傷;家屬:不到一年發生七八次事故;臺鈴回應

      大象新聞
      2026-05-12 19:46:06
      打破常規 國內航線燃油附加費5月16日起再上調

      打破常規 國內航線燃油附加費5月16日起再上調

      財聯社
      2026-05-12 16:55:15
      2026-05-13 07:07:00
      moonfdd incentive-icons
      moonfdd
      福大大架構師每日一題
      1223文章數 67關注度
      往期回顧 全部

      科技要聞

      宇樹發布載人變形機甲,定價390萬元起

      頭條要聞

      特朗普稱將同中方討論對臺軍售和黎智英案 外交部回應

      頭條要聞

      特朗普稱將同中方討論對臺軍售和黎智英案 外交部回應

      體育要聞

      騎士終于玩明白了?

      娛樂要聞

      白鹿風波升級!掉粉20萬評論區淪陷

      財經要聞

      利潤再腰斬 京東干外賣后就沒過過好日子

      汽車要聞

      吉利銀河“TT”申報圖曝光 電動尾翼+激光雷達

      態度原創

      家居
      本地
      時尚
      手機
      公開課

      家居要聞

      極簡主義下的居住場域與空間

      本地新聞

      用蘇繡的方式,打開江西婺源

      普通人真該學學如何穿搭!多穿裙子比褲子更時髦,大方提氣質

      手機要聞

      谷歌攜手蘋果升級換機體驗:iPhone轉安卓可遷移密碼、主屏布局

      公開課

      李玫瑾:為什么性格比能力更重要?

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 人妻激情偷乱视频一区二区三区 | 国产精品一区av在线观看| 韩国一级永久免费观看网址| 高清无码18| 国产精品亚洲一区二区z| 华人91视频| 久久久久人妻精品区一| 国产原创一区二区三区| 久久久噜噜噜久久久| 九九综合九色综合网站| 粉嫩一区二区三区国产精品| 久久毛片少妇高潮| 人妻少妇乱子伦a片| 亚洲一本大道无码AV天堂| 中文字幕VA一区二区三区| 亚洲中文字幕一区二区| 午夜激情小视频一区二区| A级无码| 欧美日韩一区二区三区视频播放| 国产91熟女高潮一区二区 | 欧美成人精品三级网站| 色天使综合婷婷国产日韩AV | 91精品国产无码在线观看| 亚洲成a人片在线网站 | 国产永久免费高清在线观看| 亚洲中文字幕AV在天堂| 男女动态无遮挡动态图| 久久亚洲精品中文字幕三区| 精品国偷自产在线视频九色| 欧美喷水抽搐magnet| 国精品无码一区二区三区左线| 九一看片| 无码精品a∨在线观看中文| 在线播放蜜桃麻豆| 99热这里只有精品免费观看| 国产精品亚洲专区无码不卡 | 99国产精品一区二区蜜臀| 韩国无码AV片午夜福利| 国产精品午夜无码AV天美传媒| 久久95| 免费网站观看www在线观|