Wybierz punkt początkowy i rozpocznij "chodzenie" do innych węzłów, aż się wyczerpiesz. Rób to, dopóki nie znajdziesz wszystkich składników. To będzie działać w O(n)
, gdzie n
jest wielkością wykresu.
szkieletu roztworze Pythonie
class Node(object):
def __init__(self, index, neighbors):
self.index = index
# A set of indices (integers, not Nodes)
self.neighbors = set(neighbors)
def add_neighbor(self, neighbor):
self.neighbors.add(neighbor)
class Component(object):
def __init__(self, nodes):
self.nodes = nodes
self.adjacent_nodes = set()
for node in nodes:
self.adjacent_nodes.add(node.index)
self.adjacent_nodes.update(node.neighbors)
@property
def size(self):
return len(self.nodes)
@property
def node_indices(self):
return set(node.index for node in self.nodes)
@property
def is_saturated(self):
return self.node_indices == self.adjacent_nodes
def add_node(self, node):
self.nodes.append(node)
self.adjacent_nodes.update(node.neighbors)
adj_matrix = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
matrix_size = len(adj_matrix)
nodes = {}
for index in range(matrix_size):
neighbors = [neighbor for neighbor, value in enumerate(adj_matrix[index])
if value == 1]
nodes[index] = Node(index, neighbors)
components = []
index, node = nodes.popitem()
component = Component([node])
while nodes:
if not component.is_saturated:
missing_node_index = component.adjacent_nodes.difference(component.node_indices).pop()
missing_node = nodes.pop(missing_node_index)
component.add_node(missing_node)
else:
components.append(component)
index, node = nodes.popitem()
component = Component([node])
# Final component needs to be appended as well
components.append(component)
print max([component.size for component in components])
Więc coś jak przeszukiwanie w głąb mogą być wykorzystane do tego? – JasonMortonNZ
Tak. Spróbuję przedstawić ci rozwiązanie w Pythonie, ponieważ jest to zabawny problem. Rozwiązanie, które miałem na myśli, było jednak szersze. – bossylobster
DFS i BFS są równoważne do tego konkretnego celu. Poszedłbym z BFS, ponieważ jest to nieco łatwiejsze do wdrożenia (kolejka zamiast stosu), ale każdy CS warty swojej soli powinien być w stanie zakodować oba. Odwołaj się do Biblii (CLRS * Wprowadzenie do algorytmów *), jeśli utkniesz. –