<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-05-13 17:19:38
      炸鍋!皇馬傳奇公開抵制穆里尼奧,老佛爺發布會當場發飆

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

      瀾歸序
      2026-05-13 04:10:08
      超預期!美國,重磅發布

      超預期!美國,重磅發布

      證券時報
      2026-05-12 21:52:07
      28億美元!被字節逼到無路可走的喜馬拉雅終于賣給了騰訊

      28億美元!被字節逼到無路可走的喜馬拉雅終于賣給了騰訊

      傳心財經
      2026-05-13 17:38:12
      美國總統特朗普抵京(視頻)

      美國總統特朗普抵京(視頻)

      新民周刊
      2026-05-13 20:47:15
      特斯拉"輕松貸"上線:Model 3首付5.59萬起,5年0息方案入場

      特斯拉"輕松貸"上線:Model 3首付5.59萬起,5年0息方案入場

      賽博蘭博
      2026-05-13 08:53:06
      揭秘美總統外訪陣仗有多夸張,血漿自帶,安保足夠打一場小型戰爭

      揭秘美總統外訪陣仗有多夸張,血漿自帶,安保足夠打一場小型戰爭

      嫹筆牂牂
      2026-05-12 16:44:04
      “十年燒烤無人問,一墻書法天下知!”女孩在父親店寫《將進酒》

      “十年燒烤無人問,一墻書法天下知!”女孩在父親店寫《將進酒》

      一絲不茍的法律人
      2026-05-12 21:58:34
      烏軍展開鏡像反擊,美將俄列為全球最腐敗國家,美宣布從歐洲撤軍

      烏軍展開鏡像反擊,美將俄列為全球最腐敗國家,美宣布從歐洲撤軍

      史政先鋒
      2026-05-13 18:59:40
      南京審計大學偷拍男生已被開除,被曝光后曾說自己真的要完了

      南京審計大學偷拍男生已被開除,被曝光后曾說自己真的要完了

      映射生活的身影
      2026-05-13 00:04:37
      416億買來的教訓:剝離格力后,集團再也無法撼動董明珠的鐵王座

      416億買來的教訓:剝離格力后,集團再也無法撼動董明珠的鐵王座

      李砍柴
      2026-05-12 21:51:06
      美國總統5月13日幾點到達北京?美國到北京的飛機要幾個小時?

      美國總統5月13日幾點到達北京?美國到北京的飛機要幾個小時?

      烈史
      2026-05-13 13:19:23
      人民日報怒批機關事業單位的三大怪狀,引基層人員共鳴!

      人民日報怒批機關事業單位的三大怪狀,引基層人員共鳴!

      細說職場
      2026-05-13 14:44:39
      鄭強翻車,翻得一點也不冤!

      鄭強翻車,翻得一點也不冤!

      梳子姐
      2026-05-13 12:19:44
      今夜,美聯儲,利空突襲!芯片半導體,集體大跌

      今夜,美聯儲,利空突襲!芯片半導體,集體大跌

      中國基金報
      2026-05-13 00:11:54
      陽氣是最好的良藥,做好這6點,陽氣通氣血足

      陽氣是最好的良藥,做好這6點,陽氣通氣血足

      神奇故事
      2026-05-12 22:27:07
      四川武警營門推哨兵后續:大家都搞錯了罪名,她面臨的不是襲警罪

      四川武警營門推哨兵后續:大家都搞錯了罪名,她面臨的不是襲警罪

      奇思妙想草葉君
      2026-05-13 18:25:17
      事態升級了!四川凌晨追打案后續:6人全帶走,女子襲警細節被扒

      事態升級了!四川凌晨追打案后續:6人全帶走,女子襲警細節被扒

      小鋭有話說
      2026-05-13 15:41:41
      馬斯克:我正乘坐空軍一號前往北京 老黃在我旁邊

      馬斯克:我正乘坐空軍一號前往北京 老黃在我旁邊

      財聞
      2026-05-13 18:36:00
      撕破臉了?國際足聯官網剔除中文,甩出談判籌碼,遭40億索賠壓頂

      撕破臉了?國際足聯官網剔除中文,甩出談判籌碼,遭40億索賠壓頂

      霽寒飄雪
      2026-05-13 16:47:06
      2026-05-13 21:03:00
      moonfdd incentive-icons
      moonfdd
      福大大架構師每日一題
      1223文章數 68關注度
      往期回顧 全部

      科技要聞

      騰訊一季度營收1964.6億元 同比增9%

      頭條要聞

      美國總統時隔9年再次訪華 特朗普抵達北京

      頭條要聞

      美國總統時隔9年再次訪華 特朗普抵達北京

      體育要聞

      14年半,74萬,何冰嬌沒選那條更安穩的路

      娛樂要聞

      白鹿掉20萬粉,網友為李晨鳴不平

      財經要聞

      美國總統特朗普抵達北京

      汽車要聞

      C級純電轎跑 吉利銀河"TT"申報圖來了

      態度原創

      教育
      家居
      親子
      游戲
      軍事航空

      教育要聞

      活動報名丨管理學博士預備課暨招生說明會@上海

      家居要聞

      內在自敘,無域有方

      親子要聞

      見義勇為的小工程車

      LCK第二賽段:DK連下兩城擊潰DNS!菜隊還是一如既往的菜

      軍事要聞

      沙特被指3月曾對伊朗發動多次“報復性”空襲

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 亚州黄色电影| 欧美精品亚洲日韩aⅴ| 亚洲香蕉成人av网站在线观看| 丰满岳妇乱一区二区三区| 成a人片亚洲日本久久| 欧美熟妇性XXXX欧美熟人多毛| 精品国产日本| 国产h视频在线观看视频| 性欧美暴力猛交69hd| 九九热在线观看精品视频| 撸色网| 67194成是人免费无码| 亚洲国产中文曰韩丝袜| 成人区人妻精品一区二区| 亚洲精品自拍在线视频| 国产精品日韩中文字幕| 一区二区三区XX00| 亚洲色成人www永久网站| 精品国产三级a在线观看| 亚洲欧洲自拍拍偷午夜色| 亚洲成av人在线观看网址| 永久免费不卡在线观看黄网站| 久久99久久精品视频| 国产男女爽爽爽免费视频| 微拍福利一区福利二区| 无码人妻品一区二区三区精99| √国产精品| 伊人蕉影院久亚洲高清| 激情狠狠| 久99视频精品免费观看福利 | 免费看男女做爰爽爽视频| 无码人妻系列| 尤物视频网| 色六月婷婷亚洲婷婷六月| 无码国产精品久久一区免费| 男人日女人视频网站| 曰本女人牲交全视频播放| 极品美女高潮喷白浆视频| 精品日本乱一区二区三区| 亚洲电影资源| 狠狠色亚洲|