Вначале убрать дубликаты, если входные данные это позволяют. Потом каждой такой паре перехода назначить уникальный ID, т.е. в данном случае это будет обыкновенный массив ['a->b', 'd->f'] где номер значения и есть id. Потом создать массивы для каждого a, b, c из ID возможных переходов. Затем для каждого a, b, c придумать аглоритм поиска цепочек, и находить самые длинные, если цепочка достигла длинны массива возможных переходов - получили замкнутую цепь с кротчайшим путем. А так конечно нужно думать, много нюансов вылезет наверняка, на бумажке такое не придумаешь...