Finding cycle of 3 nodes ( or triangles) in a graph

后端 未结 11 2065
南旧
南旧 2020-12-31 15:42

I am working with complex networks. I want to find group of nodes which forms a cycle of 3 nodes (or triangles) in a given graph. As my graph contains about million edges, u

11条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-31 16:35

    I am working on the same problem of counting number of triangles on undirected graph and wisty's solution works really well in my case. I have modified it a bit so only undirected triangles are counted.

        #### 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)
    

    Of course, you need to use a dictionary for example

        #### 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
    

    Using the code of Wisty, the triangles found will be [(0, 1, 2), (0, 2, 1), (0, 3, 1), (1, 2, 3)]

    which counted the triangle (0, 1, 2) and (0, 2, 1) as two different triangles. With the code I modified, these are counted as only one triangle.

    I used this with a relatively small dictionary of under 100 keys and each key has on average 50 values.

提交回复
热议问题