合併兩棵樹後求最小直徑
3203。合併兩棵樹後求最小直徑
難度:難
主題:樹、深度優先搜尋、廣度優先搜尋、圖
存在兩棵無向樹,分別有n和m個節點,編號分別為0到n - 1和0到m - 1。給定兩個二維整數數組edges1和edges2,長度分別為n - 1和m - 1,其中edges1[i] = [ai, bi]表示有是第一棵樹中節點ai 和bi 之間的邊,edges2[i] = [ui, vi] 表示第二棵樹中的節點ui 和vi 之間有一條邊。
您必須使用邊將第一棵樹中的一個節點與第二棵樹中的另一個節點連接起來。
回傳所得樹的最小值可能的直徑。
樹的直徑是樹中任兩個節點之間最長路徑的長度。
範例1:
- 輸入: Edges1 = [[0,1],[0,2],[0,3]], Edges2 = [[0,1]]
- 輸出: 3
- 說明:將第一棵樹的節點 0 與第二棵樹的任意節點連接,我們可以得到一棵直徑為 3 的樹。
範例2:
- 輸入:edges1 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2, 7]],邊2 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]]
- 輸出: 5
- 說明:將第一棵樹的節點 0 與第二棵樹的節點 0 連接起來,我們可以得到一棵直徑為 5 的樹。
約束:
- 1 5
- edges1.length == n - 1
- edges2.length == m - 1
- edges1[i].length == Edges2[i].length == 2
- edges1[i] = [ai, bi]
- 0 i, bi
- edges2[i] = [ui, vi]
- 0 i, vi
- 產生輸入,使得edge1和edge2代表有效的樹。
提示:
- 假設我們將tree1中的節點a與tree2中的節點b連結起來。產生的樹的直徑長度將是以下 3 個值中最大的一個:
- 樹的直徑1.
- 樹的直徑2.
- 從節點 a 開始且完全在樹 1 內的最長路徑的長度 從節點 b 開始且完全在樹 2 內的最長路徑的長度 1.
- 第三個值中新增的一個是由於我們在樹 1 和 2 之間添加了額外的邊。
- 無論我們選擇 a 和 b,值 1 和 2 都是恆定的。因此,我們需要以最小化值 3 的方式選擇 a 和 b。
- 如果我們選擇最佳的 a 和 b,它們將分別位於 Tree 1 和 Tree 2 的直徑內。我們到底該選擇哪些直徑的節點?
- a 是樹 1 的直徑中心,b 是樹 2 的直徑中心。
解:
我們需要逐步解決它,重點是了解如何計算樹的直徑以及連接兩棵樹如何影響總直徑。
解決步驟:
-
求每棵樹的直徑:
- 樹的直徑是任兩個節點之間最長的路徑。為了找到它,我們可以使用以下兩個步驟:
- 從任意節點執行 BFS(或 DFS)以找到最遠的節點(我們將此節點稱為 A)。
- 從A開始再進行一次BFS(或DFS),找出距離A最遠的節點(我們稱這個節點為B),A到B的距離就是樹的直徑。
- 樹的直徑是任兩個節點之間最長的路徑。為了找到它,我們可以使用以下兩個步驟:
-
確定最佳連接節點:
- 從問題的提示來看,連接兩棵樹時最小化附加直徑的最佳方法是連接兩棵樹的直徑中心。這將最大限度地減少新邊造成的最長路徑。
- 樹直徑中的最佳節點通常是“中心”,可以透過從直徑的端點執行 BFS 並找到最長路徑的中間來找到它。
-
最小化總直徑:
- 一旦我們找到兩棵樹的中心,新的直徑就是以下值中的最大值:
- 樹 1 的直徑。
- 樹 2 的直徑。
- 樹 1 中的最長路徑、樹 2 中最長的路徑、新連接邊 1 的總和。
- 一旦我們找到兩棵樹的中心,新的直徑就是以下值中的最大值:
讓我們用 PHP 實作這個解:3203。合併兩棵樹後求最小直徑
解釋:
BFS 輔助函數:bfs 函數計算距離給定起始節點最遠的節點,並傳回距離陣列和找到的最遠節點。這對於計算樹的直徑至關重要。
取得直徑和中心:getDiameterAndCenter 函數找出樹的直徑及其中心。合併兩棵樹時,樹的中心對於最小化新樹的直徑至關重要。
-
主要解:
- 我們先為兩棵樹建立鄰接表。
- 我們計算兩棵樹的直徑和中心。
- 我們從兩棵樹的中心執行 BFS,以獲得每棵樹內的最長路徑。
- 最後,我們計算三個值中的最大值,得到合併樹的最小直徑。
時間複雜度:
- 建立鄰接表:O(n·m)
- BFS 遍歷:O(n·m)
- 總體時間複雜度為 O(n m),對於 105. 輸入大小限制是有效的
這種方法確保我們在合併兩棵樹時找到盡可能小的直徑。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
- 領英
- GitHub
以上是合併兩棵樹後求最小直徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。
