<tr id="tp1vn"><td id="tp1vn"><dl id="tp1vn"></dl></td></tr>
  1. <p id="tp1vn"></p>
  2. <sub id="tp1vn"><p id="tp1vn"></p></sub>
    <u id="tp1vn"><rp id="tp1vn"></rp></u>
    <meter id="tp1vn"></meter>
      <wbr id="tp1vn"><sup id="tp1vn"></sup></wbr>
      日韩第一页浮力,欧美a在线,中文字幕无码乱码人妻系列蜜桃 ,国产成人精品三级麻豆,国产男女爽爽爽免费视频,中文字幕国产精品av,两个人日本www免费版,国产v精品成人免费视频71pao
      網易首頁 > 網易號 > 正文 申請入駐

      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.

      相關推薦
      熱點推薦
      江怡臻說,腳踏進人民大會堂,整個人就“戰戰兢兢,如履薄冰”了

      江怡臻說,腳踏進人民大會堂,整個人就“戰戰兢兢,如履薄冰”了

      果媽聊娛樂
      2026-04-16 09:19:20
      3大利空炸盤!光迅跌停長飛跌9%,29只光模塊龍頭集體重挫

      3大利空炸盤!光迅跌停長飛跌9%,29只光模塊龍頭集體重挫

      慧眼看世界哈哈
      2026-05-15 11:24:33
      唯一幸存者!被雷劈后身上遍布雷擊紋,站友:手機救了他

      唯一幸存者!被雷劈后身上遍布雷擊紋,站友:手機救了他

      新浪財經
      2026-05-05 10:43:16
      馬斯克:如果沒有貿易壁壘,中國車企能干掉世界上大部分車企

      馬斯克:如果沒有貿易壁壘,中國車企能干掉世界上大部分車企

      樂趣紀史
      2026-04-20 19:28:46
      黃仁勛:中國不應獲得最先進芯片,但美國不能失去市場!

      黃仁勛:中國不應獲得最先進芯片,但美國不能失去市場!

      混沌錄
      2026-05-06 22:51:03
      59歲鄭衛莉身懷六甲領獎,丈夫出軌繼子冷漠晚年生活意外

      59歲鄭衛莉身懷六甲領獎,丈夫出軌繼子冷漠晚年生活意外

      荒野老五
      2026-05-15 07:19:10
      秦嶺摩托車男子被撞死,肇事者只能賠18萬:162萬缺口,誰來填?

      秦嶺摩托車男子被撞死,肇事者只能賠18萬:162萬缺口,誰來填?

      匹夫來搞笑
      2026-05-15 17:43:05
      突發特訊!外交部通告:強烈譴責巴方有關行徑,引全球高度關注

      突發特訊!外交部通告:強烈譴責巴方有關行徑,引全球高度關注

      扶蘇聊歷史
      2026-05-15 18:55:45
      劉翔的終身合同有多牛?退役十年不工作,照樣全球旅行

      劉翔的終身合同有多牛?退役十年不工作,照樣全球旅行

      孤單是寂寞的毒
      2026-05-12 05:24:13
      炸了!菲律賓參議院槍聲響起,莎拉?杜特爾特被逼到墻角開始反撲

      炸了!菲律賓參議院槍聲響起,莎拉?杜特爾特被逼到墻角開始反撲

      凡知
      2026-05-15 19:28:27
      她是漢武帝一生的白月光,有三個成語典故出自她,她就是李夫人!

      她是漢武帝一生的白月光,有三個成語典故出自她,她就是李夫人!

      云霄紀史觀
      2026-05-15 01:56:23
      《給阿嬤的情書》總票房破2億!制片人曾說:“我說票房能過億,他們覺得我瘋了”

      《給阿嬤的情書》總票房破2億!制片人曾說:“我說票房能過億,他們覺得我瘋了”

      上觀新聞
      2026-05-14 12:36:09
      韓國千面影帝李秉憲:演技有多頂,人品就有多渣

      韓國千面影帝李秉憲:演技有多頂,人品就有多渣

      上官晚安
      2026-05-05 17:03:06
      瞞了近三個月,內塔尼亞胡終于說出實情:沒料到伊朗敢做到這一步

      瞞了近三個月,內塔尼亞胡終于說出實情:沒料到伊朗敢做到這一步

      空天力量
      2026-05-15 13:16:58
      科爾失去兩大重要助教!斯托茨斯塔克豪斯離隊 前鵜鶘主帥或加盟

      科爾失去兩大重要助教!斯托茨斯塔克豪斯離隊 前鵜鶘主帥或加盟

      羅說NBA
      2026-05-15 10:33:18
      糖尿病人千萬別碰的4種主食:很多人天天吃,血糖悄悄飆升

      糖尿病人千萬別碰的4種主食:很多人天天吃,血糖悄悄飆升

      白宸侃片
      2026-05-15 17:47:54
      “摸奶子”惹爭議!OPPO的流量反噬來了?莫奈:我背鍋?!

      “摸奶子”惹爭議!OPPO的流量反噬來了?莫奈:我背鍋?!

      品牌新
      2026-05-13 17:03:19
      抽獎得來的Switch 2被老婆偷偷送人,37歲男玩家決心離婚

      抽獎得來的Switch 2被老婆偷偷送人,37歲男玩家決心離婚

      愛游戲的萌博士
      2026-05-14 15:08:52
      萬萬沒想到,日本跪求大哥“路過”竟被無情打臉!

      萬萬沒想到,日本跪求大哥“路過”竟被無情打臉!

      葉老四
      2026-05-15 18:52:19
      俄多地爆炸,近400架烏克蘭無人機襲擊俄羅斯

      俄多地爆炸,近400架烏克蘭無人機襲擊俄羅斯

      山河路口
      2026-05-15 20:02:31
      2026-05-15 21:03:00
      moonfdd incentive-icons
      moonfdd
      福大大架構師每日一題
      1227文章數 68關注度
      往期回顧 全部

      科技要聞

      直降千元起步!蘋果華為率先開啟618讓利

      頭條要聞

      伊朗外長警告阿聯酋 指責其直接參與對伊朗的軍事行動

      頭條要聞

      伊朗外長警告阿聯酋 指責其直接參與對伊朗的軍事行動

      體育要聞

      德約科維奇買的球隊,從第6級聯賽升入法甲

      娛樂要聞

      方媛為何要來《桃花塢6》沒苦硬吃?

      財經要聞

      騰訊掉隊,馬化騰戳破真相

      汽車要聞

      高爾夫GTI刷新紐北紀錄 ID. Polo GTI迎全球首秀

      態度原創

      時尚
      房產
      本地
      教育
      軍事航空

      日常衣服千萬不用買太貴,準備幾件白色T恤,清爽百搭又實用

      房產要聞

      老黃埔熱銷之下,珠江春,為何去化僅3成?

      本地新聞

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

      教育要聞

      避開熱門內卷,這三個小眾工科專業,解鎖未來機遇

      軍事要聞

      烏克蘭首都基輔遭空襲 死亡人數增至12人

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 在线无码视频观看草草视频| 午夜无码国产理论在线| 97免费人妻在线视频| 国产熟妇搡bbbb搡bbbb| 夜夜嗨av一区二区| 亚洲精选av| 亚洲国产精品成人无码区| 狼人干?五月天| 少妇做爰免费视频网站| 九九成人精品| 中文文字幕文字幕亚洲色| 蜜桃?一区二区视频在线观看| 无码久久精品人妻一区二区三区| 亚洲最大网站免费在线观看| 男女啪啪做爰高潮无遮挡| 国产激情A∨在线视频播放| 色噜噜噜亚洲男人的天堂| 成人看的污污超级黄网站免费| 日本一区二区更新不卡| 五月婷婷影院| 久久精品女厕偷拍视频| 午夜福利无码一区二区| 国产乱子伦在线观看| 色就综合8888| 中文区av无码中文字幕dⅴd| 亚洲欧美综合乱码精品成人网| 欧美乱码卡一卡二卡四卡免费| 亚洲最大成人网站| 亚洲综合A| 亚洲乱码中文字幕小综合| 国产真实乱人偷精品人妻| 人妻精品久久无码专区精东影业| 日本一区二区精品色超碰| 又大又粗又硬又爽黄毛少妇| 午夜成年男人免费网站| 亚洲免费v片| 欧美极品少妇性运交| 人妻?无码中出| 曰曰摸夜夜添夜夜添高潮出水 | 丰满少妇熟女高潮流白浆| 亚洲18禁|