Поскольку каждый узел имеет не более 2 падающих ребер, удалите все узлы с 0 ребрами, а затем повторно удалите все узлы, у которых есть только одно падающее ребро (и соответствующее ребро).Если у вас есть цикл, вы достигнете стадии, когда нет узлов, которые вы можете удалить, но все равно останутся узлы.Если цикла нет, вы прекратите удаление всех узлов.
Редактировать: Чтобы иметь дело с, возможно, неверным вводом и быть более точным в отношении базовой структуры данных.
Поскольку данные считываются, создается структура данных, которая индексируется по идентификатору узла и для каждой индексированной записи содержит список узлов, инцидентных этому узлу.[Т.е., когда каждое ребро считывается, нужно сделать две записи, по одной для каждого из узлов.] Поскольку данные поступают, удалите дубликаты и определите, нет ли какого-либо узла в слишком большом количестве ребер.Это линейно.
Храните список узлов с одним краем инцидента.На каждом шаге алгоритма вы выбираете любой узел из этого списка и, удалив ребро, помещаете узел, с которым он связан, в этот список (при необходимости).[Если узел уже был в списке, вы можете либо удалить его, либо изменить предыдущий шаг, чтобы просто игнорировать любые ребра, взятые из списка, у которых больше нет инцидентных ребер.]
Ребро добавляется не болееодин раз в список, и каждая итерация удаляет ребро из этого списка.Следовательно, линейный.