проблема занижена, потому что вы не указали, например, если график должен оставаться связанным, или если вы хотите удалить «небольшое» количество нефиксированных ребер, чтобы разорвать все циклы, или если вам действительно необходимо удалить глобально минимальное количество нефиксированных ребер.
Если график не должен оставаться связанным, просто обойдите все ребра и удалите все нефиксированные. Это удаляет все циклы, которые вы можете удалить, не удаляя ИСПРАВЛЕННЫЕ края.
Если вы хотите, чтобы простой жадный алгоритм удалял ребра, которые являются чисто DFS, вы можете использовать что-то вроде этого, ЕСЛИ граф остается подключенным также при удалении некоторых нефиксированных ребер:
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]