Voici quelques idées pour faire mieux que toutes les paires de chemins les plus courts dans un graphe non orienté, bien que je ne sois pas sûr de l'ampleur de cette amélioration.
Voici une sous-routine qui trouvera deux nœuds distants de D, s'il y en a. Choisissez un nœud arbitraire x et calculez M[x] = la distance maximale de x à tout autre nœud (en utilisant n'importe quel algorithme de plus court chemin à source unique). Si M[x] >= D, alors x est un de nos noeuds et l'autre est facile à trouver. Cependant, si M[x] < D, aucun des points d'extrémité que nous recherchons ne peut être à une distance inférieure à D - M[x] de x (parce qu'il existe des chemins de ce nœud à tous les autres nœuds, via x, de distance < D). Trouvez donc tous les nœuds dont la distance est inférieure à D-M[x] de x et marquez-les comme mauvais. Choisissez un nouveau x, cette fois-ci en vous assurant que vous évitez tous les nœuds marqués comme mauvais, et répétez. Avec un peu de chance, nous marquerons beaucoup de nœuds comme mauvais, ce qui nous permettra d'effectuer beaucoup moins de calculs de plus court chemin que |V|.
Il ne nous reste plus qu'à définir D=diam(G) et à exécuter la procédure ci-dessus. Nous ne savons pas ce qu'est diam(G), mais nous pouvons obtenir une fourchette assez étroite, car pour tout x, M[x] <= diam(G) <= 2M[x]. Choisissez quelques x pour commencer, calculez M[x] pour chacun d'entre eux, et calculez les limites supérieure et inférieure de diam(G) comme résultat. Nous pouvons ensuite effectuer une recherche binaire dans l'intervalle résultant, en utilisant la procédure ci-dessus pour trouver un chemin de la longueur supposée, s'il y en a un.
Bien sûr, il s'agit uniquement de graphes non dirigés. Je pense que l'on pourrait faire un schéma similaire avec des graphes dirigés. Les mauvais nœuds sont ceux qui peuvent atteindre x en moins de D-M[x], et la limite supérieure de diam(G) ne fonctionne pas, il faudrait donc une plage de recherche binaire plus grande.
3 votes
Bonne question. Vous avez même fait quelques lectures avant de demander :)
2 votes
Il vaut mieux que ce soit un graphe acyclique.
0 votes
@dlamblin : J'ai ajouté une clarification répondant à votre point. Mon graphe n'est pas acyclique, mais cela n'a pas d'importance. Je cherche le "plus long chemin le plus court".
0 votes
Super question ! Pouvez-vous partager avec nous l'application ?
1 votes
@nont, voici quelques exemples : construire un graphe dont les sommets sont des mots anglais et les arêtes relient des synonymes. Puis il s'avère que ce graphe a une composante très importante . Quels sont les deux mots les plus éloignés mais "synonymes" ? Il peut s'agir de mots dirigés ou non dirigés, car certains thésaurus ne sont pas "symétriques", pour ainsi dire. Un autre exemple est de faire en sorte que les sommets soient des articles de Wikipédia et d'avoir des arêtes dirigées pour les liens. En pratique, vous pouvez souhaiter connaître deux points très éloignés sur un plan d'étage, par exemple.
0 votes
Bien sûr, dans beaucoup de mes exemples, le calcul d'un "pseudo-diamètre" ou d'un sommet "pseudo-périphérique" peut être suffisamment intéressant ou bon pour les applications. Cependant, il reste théoriquement intéressant s'il est possible de calculer exactement le diamètre du graphe.
0 votes
@Dave : Comme le dit la question, "Je suis intéressé par ce problème dans les cas non dirigés et dirigés". Je serais heureux d'avoir une réponse à l'un ou l'autre. Je suppose que le cas non dirigé serait plus facile ...
0 votes
Je vois que vous avez posé cette question à MathOverflow. Avez-vous trouvé une réponse ? La réponse de David a-t-elle été utile ? Comme vous savez que vous pouvez le calculer dans un arbre en O(N), pensez-vous qu'il existe un moyen de l'étendre aux graphes épars ? ou de donner une approximation pour eux ?