Алгоритм поиска лишних ребер в графе или дереве

Поскольку статья в Википедии, упомянутая algorithm-design @Craig, дает только представление language-independent о реализации, я публикую algorithms свою реализацию с потоками algorithms Java 8:

Map> reduction = usages.entrySet().stream()
                .collect(toMap(
                        Entry::getKey,
                        (Entry> entry) -> {
                            String start = entry.getKey();
                            Set neighbours = entry.getValue();
                            Set visited = new HashSet<>();
                            Queue queue = new LinkedList<>(neighbours);

                            while (!queue.isEmpty()) {
                                String node = queue.remove();
                                usages.getOrDefault(node, emptySet()).forEach(next -> {
                                    if (next.equals(start)) {
                                        throw new RuntimeException("Cycle detected!");
                                    }
                                    if (visited.add(next)) {
                                        queue.add(next);
                                    }
                                });
                            }

                            return neighbours.stream()
                                    .filter(s -> !visited.contains(s))
                                    .collect(toSet());
                        }
                ));

algorithm

language-agnostic

tree

graph-theory

2022-09-05T00:30:54+00:00
Вопросы с похожей тематикой, как у вопроса:

Алгоритм поиска лишних ребер в графе или дереве