import random def generate_network(C, L): # Generate a random ring of C computers ring = list(range(1, C+1)) random.shuffle(ring) links = [] # Add bidirectional links between consecutive computers for i in range(C): j = (i+1) % C links.append((ring[i], ring[j])) links.append((ring[j], ring[i])) # Add extra links randomly until L links are achieved while len(links) < L: i = random.randint(0, C-1) j = random.randint(0, C-1) if i != j and (ring[i], ring[j]) not in links: links.append((ring[i], ring[j])) links.append((ring[j], ring[i])) # Sort links by the smallest endpoint first, then lexicographically links.sort(key=lambda x: (min(x), max(x))) # Return the network design as a tuple (ring, links) return (ring, links) def find_ring(network): ring, links = network # Create a dictionary of neighbors for each computer neighbors = {i: [] for i in ring} for i, j in links: neighbors[i].append(j) # Use depth-first search to find a ring visited = set() stack = [ring[0]] while stack: current = stack.pop() visited.add(current) for neighbor in neighbors[current]: if neighbor == ring[0] and len(visited) == len(ring): # Found a ring return True if neighbor not in visited: stack.append(neighbor) # No ring found return False # Example usage network = generate_network(6, 10) print(network) print(find_ring(network))