无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網易首頁 > 網易號 > 正文 申請入駐

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.

相關推薦
熱點推薦
吃他汀一顆南瓜子不能碰?提醒:不止南瓜子,這4樣食物也要小心

吃他汀一顆南瓜子不能碰?提醒:不止南瓜子,這4樣食物也要小心

芹姐說生活
2026-05-12 16:25:54
女子結婚不到一周,卻因摩洛哥新娘視頻導致離婚

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

映射生活的身影
2026-05-12 12:13:28
浙大鄭強教授:我不承認中國大學生就業難,是舒服的工作難找,建議少點抱怨少點索取

浙大鄭強教授:我不承認中國大學生就業難,是舒服的工作難找,建議少點抱怨少點索取

TOP大學來了
2026-05-11 16:39:00
內塔尼亞胡稱“不喜歡中國向伊朗導彈制造提供的支持” 中方回應

內塔尼亞胡稱“不喜歡中國向伊朗導彈制造提供的支持” 中方回應

財聯社
2026-05-12 15:27:18
公然拒掛國旗,訂單全給日韓,長榮如今的結局早已注定

公然拒掛國旗,訂單全給日韓,長榮如今的結局早已注定

瀲滟晴方DAY
2026-05-11 06:31:37
揚眉吐氣史無前例!第一次把在任美國國務卿永久攔在中國國門外

揚眉吐氣史無前例!第一次把在任美國國務卿永久攔在中國國門外

雪中風車
2026-05-12 13:10:31
忍無可忍,烏克蘭與川普徹底攤牌,20國爭相與烏展開合作

忍無可忍,烏克蘭與川普徹底攤牌,20國爭相與烏展開合作

史政先鋒
2026-05-12 14:44:10
上海大學通報“院長蘇某某論文被舉報數據造假”:已成立調查組,啟動調查程序 ,將根據調查情況嚴肅認真處理

上海大學通報“院長蘇某某論文被舉報數據造假”:已成立調查組,啟動調查程序 ,將根據調查情況嚴肅認真處理

魯中晨報
2026-05-12 16:54:06
普京已經開始絕望:戰爭發生轉折了

普京已經開始絕望:戰爭發生轉折了

黔有虎
2026-05-11 20:02:09
15萬  !比亞迪又一款新車正式上市!

15萬 !比亞迪又一款新車正式上市!

科技堡壘
2026-05-12 13:03:17
女子推搡哨兵后續:官媒發聲,知情人爆料,恐不止坐牢這么簡單

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

千言娛樂記
2026-05-12 15:10:56
特朗普即將訪華,英媒:美已意識到中國比美國想象中更強大

特朗普即將訪華,英媒:美已意識到中國比美國想象中更強大

混沌錄
2026-05-11 18:07:10
大霧黃色預警繼續:山東江蘇等地局地有濃霧或強濃霧

大霧黃色預警繼續:山東江蘇等地局地有濃霧或強濃霧

界面新聞
2026-05-12 18:11:19
穿禮服后退款后續:女子身份曝光社死,工作遭牽連,商家準備起訴

穿禮服后退款后續:女子身份曝光社死,工作遭牽連,商家準備起訴

八斗小先生
2026-05-12 17:23:09
林浩:汶川地震9歲小英雄,被姚明抱上奧運,發誓考清華,現狀如何

林浩:汶川地震9歲小英雄,被姚明抱上奧運,發誓考清華,現狀如何

阿傖說事
2026-05-12 12:24:10
北京G3半場逆轉廣東!聯防+雙小外立功,周琦統治籃下,廣東靠2將

北京G3半場逆轉廣東!聯防+雙小外立功,周琦統治籃下,廣東靠2將

籃球資訊達人
2026-05-12 20:33:39
京滬高鐵漲價,罵聲一片

京滬高鐵漲價,罵聲一片

鳳眼論
2026-05-12 16:53:49
今早高峰江場路近云秀路SUV側翻釀3車事故 駕駛員脫困幸無人員傷亡

今早高峰江場路近云秀路SUV側翻釀3車事故 駕駛員脫困幸無人員傷亡

上觀新聞
2026-05-12 17:38:06
彭加木被找到了!知情人:DNA專家說99%就是彭加木,但有個遺憾!

彭加木被找到了!知情人:DNA專家說99%就是彭加木,但有個遺憾!

拳擊時空
2026-05-12 05:55:35
美媒披露:阿聯酋秘密對伊朗發動軍事打擊

美媒披露:阿聯酋秘密對伊朗發動軍事打擊

參考消息
2026-05-12 20:36:12
2026-05-12 21:39:00
moonfdd incentive-icons
moonfdd
福大大架構師每日一題
1221文章數 67關注度
往期回顧 全部

科技要聞

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

頭條要聞

新電動車到手不足一月頻繁自動鎖死 老人被摔傷五六次

頭條要聞

新電動車到手不足一月頻繁自動鎖死 老人被摔傷五六次

體育要聞

總是掉鏈子的“倒霉蛋”,闖進了歐戰決賽

娛樂要聞

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

財經要聞

黃仁勛真是被白宮徹底封殺了

汽車要聞

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

態度原創

數碼
旅游
藝術
房產
軍事航空

數碼要聞

綠聯推出“AP16”16英寸便攜屏:2.5K 165Hz +揚聲器,1799元

旅游要聞

藏在南京新街口的老巷子,你知道哪幾條

藝術要聞

這位畫家的油畫美人讓人驚嘆不已!

房產要聞

穗八條引爆樓市!萬博寶藏紅盤,五一勁銷出圈

軍事要聞

知情人士披露:美國或考慮恢復對伊朗軍事行動

無障礙瀏覽 進入關懷版