Я пытался гуглить реализации BFS в C, но все они, похоже, ожидают граф в виде матрицы смежности, и из того, что я понял, это позволяет быстро обнаружить все смежные узлы.
Ну нет. Матрица смежности позволяет найти набор смежных узлов за ненулевой промежуток времени, который не зависит от количества узлов. Но все еще требуется время, пропорциональное количеству узлов, чтобы определить, каковы все элементы этого набора. Другие представления, такие как смежность list , могут позволить найти множество за одно и то же постоянное время и найти его элементы во времени, пропорциональном их количеству (которое может быть намного меньше, чем общее количество узлов).
- Но что я должен делать, чтобы узнать соседние узлы, если вход имеет форму пары узлов?
Как насчет построения матрицы смежности, списка смежности или альтернативного представления, а затем его использования?
- Должен ли я хранить края и проходить по ним каждый раз, когда ищу соседей? Но это звучит медленно и похоже на то, что сделал бы я, как на меня :(.
Плоский список ребер является одним из возможных представлений. Есть способы сделать такой список более эффективным для работы (например, отсортировав его и / или проиндексировав), но зависит ли это от победы, зависит от проблемы.
- Или я как-то должен преобразовать входные данные в матрицу смежности?
Если вы действительно хотите создать матрицу смежности, начните с создания матрицы, представляющей все узлы без ребер. Прочитайте список ребер и заполните соответствующую запись для каждого ребра в нем, или две соответствующие записи, если график не ориентирован.