recherche
Maisondéveloppement back-endtutoriel phpTrouver le diamètre minimum après la fusion de deux arbres

3203. Trouver le diamètre minimum après la fusion de deux arbres

Difficulté : Difficile

Sujets : Arbre, recherche en profondeur d'abord, recherche en largeur d'abord, graphique

Il existe deux arbres non orientés avec n et m nœuds, numérotés de 0 à n - 1 et de 0 à m - 1, respectivement. Vous recevez deux tableaux d'entiers 2D Edge1 et Edge2 de longueurs n - 1 et m - 1, respectivement, où Edges1[i] = [ai, bi] indique qu'il y a est une arête entre les nœuds ai et bi dans le premier arbre et edge2[i] = [ui, vi] indique qu'il y a une arête entre les nœuds ui et vi dans le deuxième arbre.

Vous devez connecter un nœud du premier arbre avec un autre nœud du deuxième arbre avec une arête.

Renvoyer le minimum diamètre possible de l'arbre résultant.

Le diamètre d'un arbre est la longueur du le plus long chemin entre deux nœuds quelconques de l'arbre.

Exemple 1 :

Find Minimum Diameter After Merging Two Trees

  • Entrée : bords1 = [[0,1],[0,2],[0,3]], bords2 = [[0,1]]
  • Sortie : 3
  • Explication : On peut obtenir un arbre de diamètre 3 en connectant le nœud 0 du premier arbre avec n'importe quel nœud du deuxième arbre.

Exemple 2 :

Find Minimum Diameter After Merging Two Trees

  • Entrée : bords1 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2, 7]], bords2 = [[0,1],[0,2],[0,3],[2,4],[2,5],[3,6],[2,7]]
  • Sortie : 5
  • Explication : On peut obtenir un arbre de diamètre 5 en connectant le nœud 0 du premier arbre avec le nœud 0 du deuxième arbre.

Contraintes :

  • 1 5
  • edges1.length == n - 1
  • edges2.length == m - 1
  • bords1[i].length == bords2[i].length == 2
  • bords1[i] = [ai, bi]
  • 0 i, bi
  • bords2[i] = [ui, vi]
  • 0 i, vi
  • L'entrée est générée de telle sorte que les bords1 et les bords2 représentent des arbres valides.

Indice :

  1. Supposons que nous connections le nœud a de l'arbre 1 au nœud b de l'arbre 2. La longueur du diamètre de l'arbre résultant sera la plus grande des 3 valeurs suivantes :
    1. Le diamètre de l'arbre 1.
    2. Le diamètre de l'arbre 2.
    3. La longueur du chemin le plus long qui commence au nœud a et qui est complètement dans l'arbre 1. La longueur du chemin le plus long qui commence au nœud b et qui est complètement dans l'arbre 2 1.
    4. Celui ajouté dans la troisième valeur est dû à l'arête supplémentaire que nous avons ajoutée entre les arbres 1 et 2.
  2. Les valeurs 1 et 2 sont constantes quel que soit notre choix de a et b. Par conséquent, nous devons choisir a et b de manière à minimiser la valeur 3.
  3. Si nous choisissons a et b de manière optimale, ils auront respectivement les diamètres de l'arbre 1 et de l'arbre 2. Quels nœuds du diamètre devons-nous choisir exactement ?
  4. a est le centre du diamètre de l'arbre 1 et b est le centre du diamètre de l'arbre 2.

Solution :

Nous devons l'aborder étape par étape en nous concentrant sur la compréhension de la manière de calculer le diamètre d'un arbre et de la manière dont la connexion des deux arbres influence le diamètre total.

Étapes à résoudre :

  1. Trouver le diamètre de chaque arbre:

    • Le diamètre d'un arbre est le chemin le plus long entre deux nœuds quelconques. Pour le trouver, nous pouvons utiliser le processus en deux étapes suivant :
      1. Effectuez un BFS (ou DFS) à partir d'un nœud arbitraire pour trouver le nœud le plus éloigné (appelons ce nœud A).
      2. Effectuez un autre BFS (ou DFS) en partant de A pour trouver le nœud le plus éloigné de A (appelons ce nœud B), et la distance de A à B sera le diamètre de l'arbre.
  2. Déterminer les nœuds optimaux à connecter :

    • D'après l'indice du problème, la meilleure façon de minimiser le diamètre supplémentaire lors de la connexion de deux arbres est de relier les centres des diamètres des deux arbres. Cela minimisera le chemin le plus long provoqué par le nouveau bord.
    • Le nœud optimal dans le diamètre d'un arbre est généralement le "centre", qui peut être trouvé en effectuant un BFS à partir des extrémités du diamètre et en trouvant le milieu du chemin le plus long.
  3. Minimiser le diamètre total :

    • Une fois que nous avons trouvé les centres des deux arbres, le nouveau diamètre est le maximum de :
      • Le diamètre de l'arbre 1.
      • Le diamètre de l'arbre 2.
      • La somme du chemin le plus long dans l'arbre 1, du chemin le plus long dans l'arbre 2 et 1 pour le nouveau bord de connexion.

Implémentons cette solution en PHP : 3203. Trouver le diamètre minimum après la fusion de deux arbres

<?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
?>

Explication:

  1. Fonction d'assistance BFS : La fonction bfs calcule le nœud le plus éloigné d'un nœud de départ donné et renvoie le tableau de distance et le nœud le plus éloigné trouvé. Ceci est indispensable pour calculer le diamètre de l'arbre.

  2. Obtenir le diamètre et le centre : La fonction getDiameterAndCenter trouve le diamètre d'un arbre et son centre. Le centre de l'arbre est crucial pour minimiser le diamètre du nouvel arbre lors de la fusion de deux arbres.

  3. Solution principale :

    • Nous construisons d'abord des listes de contiguïté pour les deux arbres.
    • Nous calculons le diamètre et le centre des deux arbres.
    • Nous effectuons le BFS à partir des centres des deux arbres pour obtenir les chemins les plus longs au sein de chaque arbre.
    • Enfin, on calcule le maximum des trois valeurs pour obtenir le diamètre minimum de l'arbre fusionné.

Complexité temporelle :

  • Construction de la liste de contiguïté : O(n m)
  • Parcours BFS : O(n m)
  • La complexité temporelle globale est O(n m), ce qui est efficace pour la limite de taille d'entrée de 105.

Cette approche garantit que nous trouvons le diamètre minimum possible lors de la fusion des deux arbres.

Liens de contact

Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !

Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :

  • LinkedIn
  • GitHub

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Quand utiliseriez-vous un trait par rapport à une classe ou une interface abstraite dans PHP?Quand utiliseriez-vous un trait par rapport à une classe ou une interface abstraite dans PHP?Apr 10, 2025 am 09:39 AM

En PHP, le trait convient aux situations où la réutilisation de la méthode est requise mais ne convient pas à l'héritage. 1) Le trait permet aux méthodes de multiplexage des classes pour éviter une complexité de succession multiple. 2) Lorsque vous utilisez un trait, vous devez faire attention aux conflits de méthode, qui peuvent être résolus par l'alternative et comme mots clés. 3) La surutilisation du trait doit être évitée et sa responsabilité unique doit être maintenue pour optimiser les performances et améliorer la maintenabilité du code.

Qu'est-ce qu'un conteneur d'injection de dépendance (DIC) et pourquoi en utiliser un en PHP?Qu'est-ce qu'un conteneur d'injection de dépendance (DIC) et pourquoi en utiliser un en PHP?Apr 10, 2025 am 09:38 AM

Le conteneur d'injection de dépendance (DIC) est un outil qui gère et fournit des dépendances d'objets à utiliser dans les projets PHP. Les principaux avantages du DIC comprennent: 1. Le découplage, rendre les composants indépendants, et le code est facile à entretenir et à tester; 2. Flexibilité, facile à remplacer ou à modifier les dépendances; 3. Testabilité, pratique pour injecter des objets simulés pour les tests unitaires.

Expliquez le SPL SPLFixedArray et ses caractéristiques de performance par rapport aux tableaux PHP ordinaires.Expliquez le SPL SPLFixedArray et ses caractéristiques de performance par rapport aux tableaux PHP ordinaires.Apr 10, 2025 am 09:37 AM

SPLFixedArray est un tableau de taille fixe en PHP, adapté aux scénarios où des performances élevées et une faible utilisation de la mémoire sont nécessaires. 1) Il doit spécifier la taille lors de la création pour éviter les frais généraux causés par un ajustement dynamique. 2) Sur la base du tableau de langue C, fonctionne directement de la mémoire et de la vitesse d'accès rapide. 3) Convient pour le traitement des données à grande échelle et les environnements sensibles à la mémoire, mais il doit être utilisé avec prudence car sa taille est fixe.

Comment PHP gère-t-il les téléchargements de fichiers en toute sécurité?Comment PHP gère-t-il les téléchargements de fichiers en toute sécurité?Apr 10, 2025 am 09:37 AM

PHP gère les téléchargements de fichiers via la variable de fichiers $ \ _. Les méthodes pour garantir la sécurité incluent: 1. Vérifiez les erreurs de téléchargement, 2. Vérifiez le type et la taille du fichier, 3. Empêchez l'écrasement des fichiers, 4. Déplacez les fichiers vers un emplacement de stockage permanent.

Qu'est-ce que l'opérateur de coalescence nul (??) et l'opérateur de mission nuls de fusion (?? =)?Qu'est-ce que l'opérateur de coalescence nul (??) et l'opérateur de mission nuls de fusion (?? =)?Apr 10, 2025 am 09:33 AM

Dans JavaScript, vous pouvez utiliser nullcoalescingoperator (??) et nullcoalescingAssIgnmentOperator (?? =). 1.? 2.?? Ces opérateurs simplifient la logique du code, améliorent la lisibilité et les performances.

Qu'est-ce que l'en-tête de la politique de sécurité du contenu (CSP) et pourquoi est-il important?Qu'est-ce que l'en-tête de la politique de sécurité du contenu (CSP) et pourquoi est-il important?Apr 09, 2025 am 12:10 AM

Le CSP est important car il peut empêcher les attaques XSS et limiter le chargement des ressources, améliorer la sécurité du site Web. 1.CSP fait partie des en-têtes de réponse HTTP, limitant les comportements malveillants grâce à des politiques strictes. 2. L'utilisation de base consiste à permettre le chargement de ressources de la même origine. 3. L'utilisation avancée peut définir des stratégies plus fins, telles que les noms de domaine spécifiques pour charger des scripts et des styles. 4. Utilisez un en-tête de contenu-sécurité-politique-report-seul pour déboguer et optimiser les politiques CSP.

Quelles sont les méthodes de demande HTTP (obtenir, publier, mettre, supprimer, etc.) et quand chacune devrait être utilisée?Quelles sont les méthodes de demande HTTP (obtenir, publier, mettre, supprimer, etc.) et quand chacune devrait être utilisée?Apr 09, 2025 am 12:09 AM

Les méthodes de demande HTTP incluent GET, Publier, Put and Delete, qui sont utilisées pour obtenir, soumettre, mettre à jour et supprimer respectivement les ressources respectivement. 1. La méthode GET est utilisée pour obtenir des ressources et convient aux opérations de lecture. 2. La méthode post-post est utilisée pour soumettre des données et est souvent utilisée pour créer de nouvelles ressources. 3. La méthode de put est utilisée pour mettre à jour les ressources et convient aux mises à jour complètes. 4. La méthode de suppression est utilisée pour supprimer les ressources et convient aux opérations de suppression.

Qu'est-ce que HTTPS et pourquoi est-il crucial pour les applications Web?Qu'est-ce que HTTPS et pourquoi est-il crucial pour les applications Web?Apr 09, 2025 am 12:08 AM

HTTPS est un protocole qui ajoute une couche de sécurité sur la base de HTTP, qui protège principalement la confidentialité des utilisateurs et la sécurité des données via des données chiffrées. Ses principes de travail comprennent la poignée de main TLS, la vérification du certificat et la communication cryptée. Lors de la mise en œuvre de HTTPS, vous devez prêter attention à la gestion des certificats, à l'impact des performances et aux problèmes de contenu mixte.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.