検索
ホームページバックエンド開発PHPチュートリアル2 つのツリーを結合した後の最小直径を求める

3203。 2 つのツリーを結合した後の最小直径を求める

難易度: 難しい

トピック: ツリー、深さ優先検索、幅優先検索、グラフ

n と m のノードを持つ 2 つの 無向 ツリーが存在し、それぞれ 0 から n - 1 と 0 から m - 1 の番号が付けられます。それぞれ長さが n - 1 および m - 1 の 2 つの 2D 整数配列edges1 とedges2 が与えられます。ここで、edges1[i] = [ai, bi] は、最初のツリーのノード ai と bi の間のエッジであり、 edges2[i] = [ui, vi] は、ノード ui と vi の間にエッジがあることを示します。 2 番目の木。

最初のツリーの 1 つのノードと 2 番目のツリーの別のノードをエッジで接続する必要があります。

結果として得られるツリー最小可能な直径返します。

ツリーの直径は、ツリー内の 2 つのノード間の最長パスの長さです。

例 1:

Find Minimum Diameter After Merging Two Trees

  • 入力: エッジ 1 = [[0,1],[0,2],[0,3]]、エッジ 2 = [[0,1]]
  • 出力: 3
  • 説明: 最初のツリーのノード 0 を 2 番目のツリーの任意のノードと接続することで、直径 3 のツリーを取得できます。

例 2:

Find Minimum Diameter After Merging Two Trees

  • 入力: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 を 2 番目の木の節点 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 が有効なツリーを表すように生成されます。

ヒント:

  1. tree1 のノード a とtree2 のノード b を接続したとします。結果として得られるツリーの直径の長さは、次の 3 つの値のうち最大のものになります。
    1. 木の直径 1.
    2. 木の直径 2.
    3. ノード a で始まり、完全にツリー 1 内にある最長パスの長さ ノード b で始まり、完全にツリー 2 内にある最長パスの長さ 1.
    4. 3 番目の値に追加されたものは、ツリー 1 と 2 の間に追加した追加のエッジによるものです。
  2. 値 1 と 2 は、a と b の選択に関係なく定数です。したがって、値 3 を最小化する方法で a と b を選択する必要があります。
  3. a と b を最適に選択すると、それらはそれぞれ Tree 1 と Tree 2 の直径になります。正確に直径のどのノードを選択すればよいでしょうか?
  4. a は木 1 の直径の中心、b は木 2 の直径の中心です。

解決策:

木の直径を計算する方法と、2 本の木の接続が全体の直径にどのような影響を与えるかを理解することに重点を置き、段階的にアプローチする必要があります。

解決する手順:

  1. 各木の直径を求めます:

    • 木の直径は、2 つのノード間の最長の経路です。それを見つけるには、次の 2 段階のプロセスを使用できます。
      1. 任意のノードから BFS (または DFS) を実行して、最も遠いノード (このノード A と呼びます) を見つけます。
      2. A から開始して別の BFS (または DFS) を実行して、A から最も遠いノード (このノードを B と呼びます) を見つけます。A から B までの距離がツリーの直径になります。
  2. 接続する最適なノードを決定します:

    • 問題のヒントから、2 本の木を接続するときに追加直径を最小限に抑える最良の方法は、両方の木の直径の中心を接続することです。これにより、新しいエッジによって生じる最長パスが最小限に抑えられます。
    • ツリーの直径における最適なノードは通常、「中心」です。これは、直径の端点から BFS を実行し、最長のパスの中間を見つけることで見つけることができます。
  3. 合計直径を最小化します:

    • 両方のツリーの中心が見つかったら、新しい直径は次の最大値になります。
      • ツリー 1 の直径。
      • ツリー 2 の直径。
      • ツリー 1 内の最長パス、ツリー 2 内の最長パス、および新しい接続エッジの 1 の合計。

このソリューションを PHP で実装してみましょう: 3203。 2 つのツリーを結合した後の最小直径を求める

<?php /**
 * @param Integer[][] $edges1
 * @param Integer[][] $edges2
 * @return Integer
 */
function minimumDiameterAfterMerge($edges1, $edges2) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Helper function to find the diameter of a tree and the farthest node from a start node
 *
 * @param $n
 * @param $edges
 * @param $start
 * @return array
 */
function bfs($n, $edges, $start) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Helper function to find the diameter of a tree and its center
 *
 * @param $n
 * @param $edges
 * @return array
 */
function getDiameterAndCenter($n, $edges) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Example 1
$edges1 = [[0,1],[0,2],[0,3]];
$edges2 = [[0,1]];
echo minimumDiameterAfterMerge($edges1, $edges2);  // Output: 3

// Example 2
$edges1 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]];
$edges2 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]];
echo minimumDiameterAfterMerge($edges1, $edges2);  // Output: 5
?>

説明:

  1. BFS ヘルパー関数: bfs 関数は、指定された開始ノードから最も遠いノードを計算し、距離配列と見つかった最も遠いノードを返します。これは木の直径を計算するために不可欠です。

  2. 直径と中心の取得: getDiameterAndCenter 関数は、木の直径とその中心を見つけます。ツリーの中心は、2 つのツリーを結合するときに新しいツリーの直径を最小限に抑えるために重要です。

  3. 主な解決策:

    • 最初に両方のツリーの隣接リストを構築します。
    • 両方の木の直径と中心を計算します。
    • 両方のツリーの中心から BFS を実行して、各ツリー内の最長のパスを取得します。
    • 最後に、3 つの値の最大値を計算して、結合されたツリーの最小直径を取得します。

時間計算量:

  • 隣接リストの構築: O(n m)
  • BFS トラバーサル: O(n m)
  • 全体の時間計算量は O(n m) で、入力サイズ制限 105 に対して効率的です。

このアプローチにより、2 つのツリーを結合するときに可能な最小直径が確実に見つかります。

連絡先リンク

このシリーズが役立つと思われた場合は、GitHub で リポジトリ にスターを付けるか、お気に入りのソーシャル ネットワークで投稿を共有することを検討してください。あなたのサポートは私にとって大きな意味を持ちます!

このような役立つコンテンツがさらに必要な場合は、お気軽にフォローしてください:

  • LinkedIn
  • GitHub

以上が2 つのツリーを結合した後の最小直径を求めるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッション固定攻撃をどのように防ぐことができますか?セッション固定攻撃をどのように防ぐことができますか?Apr 28, 2025 am 12:25 AM

セッション固定攻撃を防ぐための効果的な方法には、次のものがあります。1。ユーザーがログインした後にセッションIDを再生します。 2。安全なセッションID生成アルゴリズムを使用します。 3。セッションタイムアウトメカニズムを実装します。 4。HTTPSを使用したセッションデータを暗号化します。これらの措置は、セッションの固定攻撃に直面するときにアプリケーションが破壊されないようにすることができます。

セッションレス認証をどのように実装しますか?セッションレス認証をどのように実装しますか?Apr 28, 2025 am 12:24 AM

セッションのない認証の実装は、サーバー側のセッションストレージなしですべての必要な情報がトークンに保存されるトークンベースの認証システムであるJSonWebtokens(JWT)を使用することで実現できます。 1)JWTを使用してトークンを生成および検証する、2)トークンが傍受されるのを防ぐためにHTTPSが使用されることを確認する、3)クライアント側にトークンを安全に保存する、4)改ざんを防ぐためにサーバー側のトークンを検証する、5)短期アクセスや長期的なリフレイを使用するなどのトークンの取り消しメカニズムを実装する。

PHPセッションに関連するいくつかの一般的なセキュリティリスクは何ですか?PHPセッションに関連するいくつかの一般的なセキュリティリスクは何ですか?Apr 28, 2025 am 12:24 AM

PHPセッションのセキュリティリスクには、主にセッションハイジャック、セッションの固定、セッション予測、およびセッション中毒が含まれます。 1。HTTPSを使用してCookieを保護することにより、セッションハイジャックを防ぐことができます。 2。ユーザーがログインする前にセッションIDを再生することにより、セッションの固定を回避できます。3。セッションの予測は、セッションIDのランダム性と予測不可能性を確保する必要があります。 4.セッションの中毒は、セッションデータを確認およびフィルタリングすることで防ぐことができます。

PHPセッションをどのように破壊しますか?PHPセッションをどのように破壊しますか?Apr 28, 2025 am 12:16 AM

PHPセッションを破壊するには、最初にセッションを開始してから、データをクリアしてセッションファイルを破壊する必要があります。 1。Session_start()を使用してセッションを開始します。 2。Session_unset()を使用して、セッションデータをクリアします。 3.最後に、session_destroy()を使用してセッションファイルを破壊して、データのセキュリティとリソースのリリースを確保します。

PHPのデフォルトセッションの保存パスをどのように変更できますか?PHPのデフォルトセッションの保存パスをどのように変更できますか?Apr 28, 2025 am 12:12 AM

PHPのデフォルトセッションの保存パスを変更する方法は?次の手順で達成できます。Session_save_path( '/var/www/sessions'); session_start(); PHPスクリプトで、セッション保存パスを設定します。 session.save_path = "/var/www/sessions"をphp.iniファイルに設定して、セッションの保存パスをグローバルに変更します。 memcachedまたはredisを使用して、ini_set( 'session.save_handler'、 'memcached')などのセッションデータを保存します。 ini_set(

PHPセッションに保存されているデータをどのように変更しますか?PHPセッションに保存されているデータをどのように変更しますか?Apr 27, 2025 am 12:23 AM

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

PHPセッションに配列を保存する例を示します。PHPセッションに配列を保存する例を示します。Apr 27, 2025 am 12:20 AM

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

Garbage CollectionはPHPセッションでどのように機能しますか?Garbage CollectionはPHPセッションでどのように機能しますか?Apr 27, 2025 am 12:19 AM

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)