Вы говорите
, я подразумеваю, что это не используется никаким другим приложением. Если приложение использует порт другие, не может использовать его, пока это не становится свободным.
, Но можно всегда соединяться с портом, в то время как другие используют его, если что-то слушает там. Иначе, http порт 80 была бы путаница.
, Если Ваш
c = new TcpClient(ip, port);
сбои, то ничто не слушает там. Иначе это соединится, даже если некоторая другая машина/приложение будет иметь сокет, открытый для того IP и порта.
Есть несколько возможностей с разными плюсами и минусами, подходящими для разных операций с графиками. В этом красивом вступлении дается предыстория и примеры использования списков смежности и матриц смежности.
Их неориентированное использование требует компромиссов (скорость космических стихов). этот учебный материал более подробно описывает стиль списка смежности и дает некоторые мысли о возможных изменениях для использования при неориентированном использовании.
Очень простой была бы хеш-таблица с ключом в качестве исходного узла и значением в виде списка соединяющихся узлов. Затем напишите функцию добавления, которая выполняет две вставки хеш-таблицы, одну как (src, tgt), другую как (tgt, src).
В ocaml:
let add n1 n2 =
let aux n1 n2 =
match Hashtbl.find_option tbl n1 with
| None -> Hashtbl.add tbl n1 [n2]
| Some nodes -> Hashtbl.replace tbl n1 (n2::nodes)
in
let _ = aux n1 n2 in
aux n2 n1
Это будет ориентированный граф, просто вы должны добавить оба направления на вставке. Функция поиска по хэш-таблице будет действовать как ваша подключенная функция
.
(Фактически, в хэш-таблицах Ocaml предлагается несколько значений для ключа, поэтому вы можете просто использовать функцию Hashtbl.find_all
и сохраните список. Но это проще всего перевести в SML.)
Хорошо, я не знаком с этим языком (прошу прощения за мое незнание):
Я бы просто использовал следующую структуру:
V.E1.E2.En+1
V2.E1.E2.En+1
Vn+1.E1.E2.En+1
так что в основном первая цифра перед десятичной будет представлять вершину,