एक शुरुआती बिंदु चुनें और जब तक आप थक गए हों तब तक अन्य नोड्स पर "चलना" शुरू करें। ऐसा तब तक करें जब तक आपको सभी घटकों को नहीं मिला। यह O(n)
में चलाएगा जहां n
ग्राफ का आकार है।
पायथन में एक समाधान का एक कंकाल:
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])
तो गहराई-पहले खोज की तरह कुछ इस के लिए इस्तेमाल किया जा सकता है? – JasonMortonNZ
हां। मैं पाइथन में आपके लिए एक समाधान की रूपरेखा तैयार करने की कोशिश करूंगा, क्योंकि यह एक मजेदार समस्या है। मेरे मन में जो समाधान था, वह पहले चौड़ाई है। – bossylobster
डीएफएस और बीएफएस इस विशेष उद्देश्य के बराबर हैं। मैं बीएफएस के साथ जाऊंगा क्योंकि यह लागू करने के लिए इतना आसान है (एक ढेर के बजाय कतार), लेकिन उनके नमक के लायक किसी भी सीएस प्रमुख दोनों को कोड करने में सक्षम होना चाहिए। यदि आप अटक जाते हैं तो बाइबल (सीएलआरएस * एल्गोरिदम के लिए परिचय *) का संदर्भ लें। –