web-dev-qa-db-fra.com

Pourquoi les algorithmes de Prim ou de Kruskal ne peuvent-ils pas être utilisés sur un graphique dirigé?

Les algorithmes de Prim et Kruskal sont utilisés pour trouver l'arbre couvrant minimum d'un graphe connecté et non orienté. Pourquoi ne peuvent-ils pas être utilisés sur un graphique orienté?

20
user1472747

C'est un miracle mineur que ces algorithmes fonctionnent en premier lieu - la plupart des algorithmes gourmands se bloquent et brûlent sur certains cas. En supposant que vous vouliez les utiliser pour trouver une arborescence s'étendant sur un minimum (chemins dirigés d'un sommet à tous les autres), alors un graphique problématique pour Kruskal ressemble à ceci.

 5
  --> a
 /   / ^
s   1| |2
 \   v /
  --> b
 3

Nous prendrons l'arc a-> b de coût 1, puis nous nous coincerons parce que nous voulions vraiment s-> b de coût 3 et b-> a de coût 2.

Pour Prim, ce graphique est problématique.

 5
  --> a
 /   /
s   1|
 \   v
  --> b
 3

Nous prendrons s-> b de coût 3, mais nous voulions vraiment s-> a de coût 5 et a-> b de coût 1.

29
David Eisenstat

L'algorithme de Prim et de Kruskal génère un arbre couvrant minimum pour un graphique connecté et "non orienté". S'il n'est pas connecté, nous pouvons les modifier pour générer des forêts couvrant un minimum.

Dans l'algorithme de Prim, nous divisons le graphique en deux ensembles de sommets. Un ensemble de sommets explorés qui ont déjà formé MST (Set1) et un autre ensemble de sommets inexplorés qui finiront par rejoindre le premier ensemble pour terminer la "répartition" (Set2). À chaque instant, nous sélectionnons un bord pondéré minimum dans la coupe joignant les deux ensembles disjoints. S'il n'y a pas d'Edge dirigé depuis les nœuds explorés de MST vers les inexplorés restants, l'algorithme reste bloqué même s'il y a des arêtes de nœuds inexplorés vers les nœuds explorés dans MST.

Dans l'algorithme de Kruskal, l'idée est de trier les bords par ordre croissant par leur poids et de les ramasser dans l'ordre et de les inclure dans les nœuds/bords explorés MST s'ils ne forment pas déjà un cycle avec des nœuds explorés. Cette opération est effectuée par Union-Find DS. Mais la détection du cycle pour les graphiques dirigés échoue avec cette méthode. Par exemple: un graphique contenant des bords [1-> 2] [2-> 3] [1-> 3] sera signalé comme contenant un cycle avec la méthode Union-Find.

Donc, Prim échoue car il suppose que chaque nœud est accessible à partir de chaque nœud qui, bien que valide pour les graphiques non orientés, peut ne pas être vrai pour les digraphes. Kruskal échoue en raison de l'échec de la détection des cycles et il est parfois essentiel d'ajouter des arêtes créant des cycles pour satisfaire la propriété pondérée "minimale" de MST.

De plus, dans le cas des digraphes, MST n'a pas de sens complet. Son équivalent pour les digraphes est "une arborescence s'étendant sur un minimum" qui produira un arbre où chaque sommet peut être atteint à partir d'un seul sommet.

5
elborak9