Sto lavorando allo stesso problema del conteggio del numero di triangoli sul grafico non orientato e la soluzione di Wisty funziona molto bene nel mio caso. L'ho modificato un po 'quindi vengono contati solo i triangoli non orientati.
#### function for counting undirected cycles
def generate_triangles(nodes):
visited_ids = set() # mark visited node
for node_a_id in nodes:
temp_visited = set() # to get undirected triangles
for node_b_id in nodes[node_a_id]:
if node_b_id == node_a_id:
raise ValueError # to prevent self-loops, if your graph allows self-loops then you don't need this condition
if node_b_id in visited_ids:
continue
for node_c_id in nodes[node_b_id]:
if node_c_id in visited_ids:
continue
if node_c_id in temp_visited:
continue
if node_a_id in nodes[node_c_id]:
yield(node_a_id, node_b_id, node_c_id)
else:
continue
temp_visited.add(node_b_id)
visited_ids.add(node_a_id)
Naturalmente, è necessario utilizzare un dizionario per esempio
#### Test cycles ####
nodes = {}
nodes[0] = [1, 2, 3]
nodes[1] = [0, 2]
nodes[2] = [0, 1, 3]
nodes[3] = [1]
cycles = list(generate_triangles(nodes))
print cycles
Utilizzando il codice di Wisty, i triangoli trovati saranno [(0, 1, 2), (0, 2 , 1), (0, 3, 1), (1, 2, 3)]
che ha contato il triangolo (0, 1, 2) e (0, 2, 1) come due triangoli diversi. Con il codice che ho modificato, questi sono contati come un solo triangolo.
L'ho usato con un dizionario relativamente piccolo con meno di 100 chiavi e ogni chiave ha in media 50 valori.
Quali algoritmi hai considerato? Che cosa hai provato? –