На относительно более высоком уровне программиста C / C ++ способ реализации графа / сети довольно сильно зависит от того, какие операции над ним выполняются.Будучи человеком ИЛИ, я, вероятно, предвзятый в своем ответе / примере здесь.Некоторые из наиболее эффективных алгоритмов, которые могут быть реализованы в графах / сетях, - это алгоритмы полиномиального времени.Большинство, если не все, алгоритмы полиномиального времени, о которых я могу думать (проблема кратчайшего пути Дейкстры, проблема транспортировки, проблема максимального потока и т. Д.), Являются частными случаями проблемы минимального потока (MCF).В вычислительном отношении одним из наиболее эффективных способов решения проблемы MCF является использование сетевого симплексного алгоритма (который сам по себе является специализацией симплексного алгоритма для решения общей линейной программы).
В алгоритме network-simplex алгоритм связующего дерева (по множеству узлов) должен быть эффективно представлен.Чтобы представить связующее дерево на графике, можно использовать различные структуры данных.К ним относятся следующие длины узлов
predecessor[], thread[] and depth[] arrays.
. В наиболее эффективных реализациях сетевых симплекс-алгоритмов, с которыми я сталкивался, они представлены не как массивы, а как некий динамически создаваемый блок памяти через
calloc(number_of_nodes, sizeof(struct vertex));
Я не уверен (на относительно более низком уровне) внутри компилятора, что / как реализовано это распределение памяти - будь то список / набор / карта.
Итак, в итоге, лучший способ реализации графа сильно зависит от операций, которые над ним выполняются.
Сетевой симплексный алгоритм и структуры данных, необходимые для эффективной реализациито же самое можно найти в этой книге .