процессе работы программы часть соединений нужно разорвать. Что лучше: BTreeSet<(usize, usize)> или Vec<usize> + Vec<(usize, bool)>? Во втором случае я храню второй конец связи (usize) с признаком активности (bool, по умолчанию true), а Vec<usize> показывает смещения откуда начинать итерацию, для каждой ноды. Кажется что преждевременно оптимизирую и надо BTreeSet.
UPD: Доступна только стдлиба, из карго приносить ничего нельзя.
Можно взять HashSet. Вариант с векторами плох для удаления произвольной дуги графа, если дуг в вершинах много — искать линейно или поддерживать сортированность и binsearch.
Для удаления надо еще найти элемент, которому установить флаг.
Ну да, и итерация по связям пострадает, надо каждый раз пропускать active=false. Вроде бы в задаче не будет совсем уж вырожденных случаев. Но видимо я всё-таки перепишу на BTreeSet.
Можно еще Vec<HashSet<usize>> Так еще проще итерироваться и обращаться.
Классика это матрица смежности либо список смежных вершин. В зависимости о того, какой граф (направленный? взвешенный?) и что с ним нужно делать. Для стандартных bfs/dfs imho adjacency-list подходит лучше: HashMap<T, Vec<T>>. Ну или если узлы 0..н-1 то Vec<Vec<usize>> будет достаточно, но если нужно много добавлять/удалять ребер, то соответственно Vec<HashSet<usize>>
struct Graph { node_count: usize, links: BTreeSet<(usize, usize)>, // (node A, node B); gates: Vec<usize>, // static subset of nodes } Сделал в итоге вот такое. Вроде бы работает. BTreeSet.range очень похож на select between по индексу.
Обсуждают сегодня