Mise à jour:
Cette solution n'est pas correcte.
La solution n'est malheureusement vraie (et simple) que pour les arbres! Trouver le diamètre d'un arbre n'a même pas besoin de cela. Voici un contre-exemple pour les graphiques (le diamètre est 4, l'algorithme renvoie 3 si vous choisissez ce ):v
Si le graphique est orienté, c'est plutôt complexe, voici un article prétendant des résultats plus rapides dans le cas dense que d'utiliser des algorithmes pour les chemins les plus courts toutes paires.
Cependant, mon point principal concerne le cas où le graphique n'est pas dirigé et avec des poids non négatifs, j'ai entendu plusieurs fois une astuce intéressante:
- Choisissez un sommetv
- Trouvez tel que est maximumud(v,u)
- Trouver tel que est maximumwd(u,w)
- Retourd(u,w)
Sa complexité est la même que deux premières recherches successives d'ampleur¹, soit si le graphe est connecté².O(|E|)
Cela semblait du folklore mais en ce moment, j'ai encore du mal à obtenir une référence ou à prouver sa correction. Je mettrai à jour lorsque j'atteindrai l'un de ces objectifs. Cela semble si simple que je poste ma réponse en ce moment, peut-être que quelqu'un l'obtiendra plus rapidement.
¹ si le graphique est pondéré, wikipedia semble dire mais je ne suis sûr que de .O(|E|+|V|log|V|)O(|E|log|V|)
² Si le graphique n'est pas connecté, vous obtenez mais vous devrez peut-être ajouter pour choisir un élément de chaque composant connecté. Je ne sais pas si c'est nécessaire et de toute façon, vous pouvez décider que le diamètre est infini dans ce cas.O(|V|+|E|)O(α(|V|))