Énumération de toutes les paires de chemins disjoints

10

Etant donné un graphe orienté et deux sommets . Une paire de chemins simples de à est disjointe de bord s'ils ne partagent pas de bord.G=(V,E)s,tVp1,p2st

En utilisant le débit max, il est facile de décider s'il existe une paire de chemins disjoints de bord de à . Maintenant, existe-t-il un algorithme polynomial de temporisation pour énumérer toutes les paires de chemins disjoints de bord de à ?stst

Amateur
la source
1
Non, car il pourrait y avoir de manière exponentielle de nombreux chemins de ce type.
Kaveh
6
@Kaveh: Je pense qu'un "algorithme de retard polynomial" peut prendre un temps exponentiel, tant que le retard entre les sorties est polynomialement long. Par exemple, il existe un algorithme de retard polynomial qui répertorie toutes les cliques maximales dans un ordre croissant, même si le nombre de cliques maximales est exponentiel.
Robin Kothari
3
Est-il possible d'inclure l'explication du retard polynomial dans la question? Je ne le connaissais pas avant d'avoir lu le commentaire de Robin.
Artem Kaznatcheev
@Robin, tu as raison, je n'ai pas prêté attention au mot "retard".
Kaveh

Réponses:

6

Je crois que la réponse d'Artem Kaznatcheev est correcte, mais elle ne donne pas d'espace polynomial. Voici donc une approche différente qui devrait fonctionner un peu mieux à cet égard.

En utilisant le flux max, il est possible de résoudre un problème un peu plus général: trouver une paire de chemins disjoints d'arête entre deux sommets {s1, s2} et une autre paire de sommets {t1, t2}, mais sans contrôler quel sommet source est connecté à quel sommet de destination.

Supposons que nous ayons un graphe G et les sommets s1, s2, t1, t2 pour lesquels nous voulons lister toutes les paires de chemins. Trouvez une seule paire de chemins P1, P2 et laissez e = (s1, v) être le premier bord de l'un de ces chemins. Ensuite, nous pouvons diviser l'espace du problème en deux sous-problèmes: les paires de chemins qui utilisent e sont les mêmes que les chemins de {v, s2} à {t1, t2} dans G-s1, et les paires de chemins qui n'utilisent pas e sont les mêmes que les chemins de {s1, s2} à {t1, t2} dans Ge. Réexaminez dans ces deux sous-problèmes et (pour éviter la duplication) ne signalez un chemin que lorsque vous êtes au bas de la récursivité.

David Eppstein
la source
1
est-il évident que l'algorithme est à retard polynomial si on attend jusqu'au bas de la récursivité?
Artem Kaznatcheev
La récursion prend polynomialement de nombreux niveaux à fond (car chaque niveau supprime quelque chose du graphique), et chaque branche retourne immédiatement (car elle ne peut pas trouver une paire de chemins) ou descend et retourne quelque chose, alors oui, elle ne prend que le retard polynomial.
David Eppstein
5

C'est la première fois que je lis sur les algorithmes de retard polynomial, donc je ne suis pas sûr à 100% de ma réponse, mais je pense que quelque chose comme ce qui suit devrait fonctionner.

Choisissez une convention pour représenter les chemins qui ont un ordre total naturel défini dessus. (Un exemple serait juste de lister les sommets du chemin et de les ordonner lexicographiquement). Choisissez votre structure de données préférée sur place qui prend en charge la recherche logarithmique et insérez (par exemple, un arbre rouge-noir). Soit votre graphique<DG

Définissez un algorithme :F


F(s,t,G,D) :

(ici signifie une référence à une infrastructure de données in situ )DD

  1. exécutez votre algorithme poly-temps pour renvoyer une paire de chemins bord-disjoints avec de à .(P,Q)P<Qst
  2. Si se trouve pas dans .(P,Q)D

    2.1. Insérez dans (et sortez si vous êtes supposé sortir pendant que l'algorithme s'exécute).(P,Q)D

    2.2. Pour chaque bord exécutezuvE(PQ)F(s,t,G{uv},D)


Maintenant, pour énumérer tous vos chemins, créez un vide et pour chaque paire avec (si le graphique n'est pas orienté, sinon) exécutez . Vous afficherez chaque chemin la première fois que vous les verrez, et vous aurez également une belle structure de données consultable qui contient tous les chemins lorsque vous avez terminé. Notez que cet algorithme s'exécute également en temps polynomial dans la taille de l'entrée + sortie (tout comme n'importe quel algorithme de retard polynomial).Ds,tV(G)s<tstF(s,t,G,D)

Je doute que ce soit la meilleure façon de le faire, en particulier cette approche n'est pas dans (en taille de l'entrée). Je pense qu'en réfléchissant bien, vous pourriez trouver quelque chose qui fonctionne dans , bien qu'il ne puisse pas construire la structure de données au fur et à mesure.PSPACEPSPACE

Artem Kaznatcheev
la source
2

Birmelé et al montrent un algorithme de retard partir de la version sommet-disjoint du problème dans "Efficient Bubble Enumeration in Directed Graphs".O(m)

Rui Ferreira
la source