Voici (une tentative) un algorithme polynomial pour le arbitraire binaire LMC DAG .g
Cela répond à la question n ° 3. (Désolé pour l'écriture désordonnée à l'avance. :))
Pour commencer, jeter « pour toujours » tout sommet pas accessible de . Nous ne nous en soucions pas, car ils ne font partie d'aucun chemin s - t .sst
Ensuite, définissez les sous-DAG et B , initialement vides. Alors, pour tous les sommets v ∈ G - { s , t } ,UNEBv ∈ G - { s , t }
Testez s'il existe un chemin de à t . Si oui, ajoutez v à A . Sinon, ajoutez - v à B .vtvUNEvB
Soit les arêtes de et B celles induites par les sommets de chaque ensemble (pour l'instant, ignorez toutes les arêtes de s à A , de A à t et de A à B ; notez également qu'il n'y a pas d'arêtes de B à t par construction).UNEBsUNEUNEtUNEBBt
Ensuite, calculer la fermeture transitive de . A savoir, nous sommes intéressés à trouver une série de sommets { a * } qui sont les « feuilles » de la sous-DAG A .UNE{ a∗}UNE
Fixer un tel . Observer qu'il doit y avoir un bord dirigé depuis un * à t . C'est parce que, par construction, (i) il y a un chemin s - t à travers un ∗ , (ii) il n'y a pas de chemin de a ∗ à B , et (iii) puisque A est lui-même un DAG et a ∗ est une feuille de A , il n'y a pas de chemin entre a ∗ et un autre sommet de A vers t .une∗une∗tstune∗une∗BUNEune∗UNEune∗UNEt
Maintenant, il doit également y avoir une arête dirigée de chaque sommet dans vers un sommet dans B , ou certains des { a ∗ } ont une arête unique vers t . Dans les deux cas, nous sommes autorisés à supprimer toute une * → t bord.{ a∗}B{ a∗}ta∗→t
Si = 1, alors soit nous devons supprimer l'arête de l'unique a ∗ → t , soit il y a un sommet plus tôt dans le chemin s - t contenant un ∗ qui a deux chemins vers t - un à travers un ∗ et un directement. Dans le cas où celui-ci pourrait tenir, nous enregistrons un ∗ → t et procédons "à reculons goulûment" (détails ci-dessous).|{a∗}|a∗→tsta∗ta∗a∗→t
Si > 1, alors nous devons soit supprimer toutes les arêtes de { a ∗ } → t , soit il y a un certain nombre d'arêtes k < | { a ∗ } | plus tôt dans la fermeture transitive de A qui déconnecte tous les chemins de s à travers le { a ∗ } à t .|{a∗}|{a∗}→tk<|{a∗}|As{a∗}t
C'est là que nous utilisons le fait que le graphe est un DAG binaire.G
Considérons l'ensemble des prédécesseurs de . Étant donné que chacun de ces sommets a au plus deux degrés, il existe exactement trois cas:{a∗}
Cas 1. prédécesseur A a un hors-bord à un sommet dans et un hors-bord à un sommet en B .{a∗}B
Dans ce cas, peu importe que nous supprimions l'arête du prédécesseur au sommet dans ou l'arête du sommet dans { a ∗ } à t . Par conséquent, nous pouvons «ignorer» ce sommet (et vérifier si le chemin vers l'arrière fusionne avec le chemin d'un autre sommet dans { a ∗ } ).{a∗}{a∗}t{a∗}
Cas 2. Un prédécesseur a un bord extérieur à un sommet dans et un autre prédécesseur de { a ∗ } .{a∗}{a∗}
Dans ce cas, nous devons soit supprimer les deux bords de à t , soit supprimer un seul bord antérieur du chemin de s au prédécesseur qui déconnecte les deux chemins.{a∗}ts
Cas 3. Un prédécesseur a un bord extérieur à deux sommets dans .{a∗}
Ceci est identique au cas 2. Peu importe que nous supprimions l'une des arêtes de ce prédécesseur et les autres arêtes correspondantes de à t , ou les deux arêtes de { a ∗ } à t . Nous voulons juste savoir si nous pouvons déconnecter le chemin de s par ce prédécesseur à t avec un seul bord plus tôt dans le chemin de s au prédécesseur.{a∗}t{a∗}tsts
Au total, alors que nous parcourons les prédécesseurs dans la fermeture transitive de , nous pouvons goulûment suivre les choix «les meilleurs jusqu'à présent». Autrement dit, à chaque étape, nous avons un choix évident qui implique la suppression d'un certain nombre d'arêtes, mais nous voulons attendre de voir si une meilleure option est disponible. Une fois qu'une meilleure option est trouvée, nous pouvons «oublier» l'option précédente. Par conséquent, un choix gourmand à chaque couche de prédécesseurs suffit (tant que nous attendons la fin pour nous engager dans n'importe quel choix).A
Par conséquent, avec une mémorisation de base, les complexités temporelles et spatiales de ce processus semblent être au plus . Cela laisse de côté le fait que, alors que nous pouvons identifier localement / avidement quand nous avons trouvé un «choix moins cher», il est a priori peu clair quels bords précédemment enregistrés à supprimer. Par conséquent, nous enregistrons l'ordre dans lequel nous vérifions les bords au fur et à mesure. Après avoir trouvé une meilleure option, nous répétons la recherche jusqu'à ce point afin de trouver les bords précédemment enregistrés à supprimer. La complexité temporelle totale de cette étape est O ( | E | 2 ) et la complexité spatiale O ( | E | )O(|E|)O(|E|2)O(|E|).
Au total, la complexité temporelle est pour l'initialisation, plus O ( | V | 3 ) pour la fermeture transitive, plus O ( | E | 2 ) pour la recherche. Le temps total est O ( | V | 2 + | E | | V | + | V | 3O(|V|⋅(|V|+|E|))O(|V|3)O(|E|2) .O(|V|2+|E||V|+|V|3+|E|2)=O(|V|3+|E|2)
À la fin du processus, nous obtenons l'ensemble minimal d'arêtes requis pour déconnecter de t tout en préservant au moins un bord extérieur de chaque sommet du graphique (ou nous découvrons qu'une solution est impossible en cours de route et abandonnons).st