Я указал на недостатки вашей спецификации в комментариях.
То, что я думаю , что вы хотите, концептуально, это начать с графа G из всех ребер (v, w), где dist (v, w) <=DIST.Это будет содержать много циклов.В этом графе вы хотите найти дерево T, обнаруженное путем поиска ширины сначала по начальной вершине. </p>
Чтобы достичь этого, вам не нужно строить G. Как вы уже поняли, вы можете выполнить итерациювсе пары вершин и проверьте их с помощью dist (v, w) <= DIST, чтобы обнаружить ребра в G по мере необходимости. </p>
BFS использует очередь.В итоге вы получите такой алгоритм:
Let x be the start vertex
Let N be a set initially containing all vertices (not yet infected)
Let Q be a queue for vertices
Let T be the initially empty set of tree edges
Add x to Q and remove it from N // Infect x.
while Q is not empty
Pop vertex v from the head of Q
for each vertex w in N // Iterate through all non-infected vertices
if dist(v, w) < DIST
Add edge v->w to T // w is now infected
add w to the tail of Q
remove w from N
return T
Это переводит почти строку за строкой в Java.
Обратите внимание, что на выходе должно быть дерево, потому что каждая вершина w может быть удалена из N только один раз.Следовательно, в T может быть только одно ребро формы v-> w. Это означает, что каждая вершина имеет не более одного родителя, что является определением ориентированного дерева.
Как я уже говорил в комментариях, нетгарантируйте, что это будет включать все вершины в дереве, если промежутки между ними слишком велики.
Просто для удовольствия, вот пример выходных данных для случайно расположенных вершин.Начальная вершина двойного размера к верхнему левому углу.
Обратите внимание, что вершины не включены, потому что они слишком далеко от любого источника инфекции.Это правильно.