le problème est sous-estimé car vous n'avez pas spécifié, par ex. si le graphe doit rester connecté, ou si vous voulez supprimer un "petit" nombre d'arêtes non-FIXES pour casser tous les cycles, ou si vous avez vraiment besoin du nombre minimum global d'arêtes non FIXES à supprimer.
Si le graphique n'a pas besoin de rester connecté, il suffit de parcourir tous les bords et de supprimer tous ceux qui ne sont pas FIXES. Cela supprime tous les cycles que vous pouvez supprimer sans enlever les bords FIXES.
Si vous voulez un algorithme glouton simple pour enlever les arêtes qui est DFS pur, vous pouvez utiliser quelque chose comme cela si le graphique reste également connecté lorsque vous supprimez certaines des arêtes non FIXE:
proc recurse(vertex n, vertex_set ns)
if (n appers_in ns) // it is a cycle
return BREAK_CYCLE
else for (e in list_outgoing_edges_from(n))
np = e.destination
result = recurse(np, add_to_set(ns, np))
if (result == BREAK_CYCLE)
if (e.FIXED)
return BREAK_CYCLE
else
[remove e from the graph]
return RETRY
else if (result == RETRY)
return recurse(n, ns)
return FINISHED
if (recurse (your_initial_node, empty_vertex_set()))
[graph contains a cycle through only FIXED edges]
else
[the reachable component from initial_node has no longer cycles]
Il n'est pas clair si vous voulez un arbre recouvrant minimal englobant tous les bords fixes, ou le plus grand DAG avec tous les bords fixes. – user44242
Le graphe que je possède ne contient aucun cycle si seulement les fixes sont utilisés. Le résultat que je veux est exactement ce que vous obtiendrez si vous effectuez une recherche DFS et supprimez les arêtes arrière. Mais certains de mes bords sont fixes et ne peuvent pas être supprimés alors quand un bord fixe est un bord arrière, je veux revenir dans la pile d'appels récursifs et enlever le premier bord amovible. Ceci est implémentable mais a une complexité trop élevée donc il sera trop lent pour certains de mes cas typiques. – pete