簡體   English   中英

在BFS / DFS中對邊緣進行排序

[英]Sort edges in BFS/DFS

我正在處理邊緣排序的問題,其中邊緣以元組形式(node_i, node_j)存儲,如下所示

>> edgeLst
>> [('123','234'),
    ('123','456'),
    ('123','789'),
    ('456','765'),
    ('456','789')
    ('234','765')]

請注意,邊是唯一的,如果看到('123', '234') ,就不會看到('234', '123') (圖形是無向的)。 圖中可能有一個循環。 由於該圖非常大,是否有人可以向我展示使用給定起始節點(例如'123'對BFS和DFS中的邊緣進行排序的有效方法?

演示輸出:

>> edgeSorting(input_lst=edgeLst, by='BFS', start_node='123')
>> [('123','234'),
    ('123','456'),
    ('123','789'),
    ('234','765')
    ('456','765'),
    ('456','789')]

這是針對BFS和DFS的方法:

from collections import defaultdict
def sorted_edges(input_lst, by, start_node):
    # Key the edges by the vertices
    vertices = defaultdict(lambda: [])
    for u, v in input_lst:
        vertices[u].append(v)
        vertices[v].append(u)
    if by == 'DFS':
        # Sort the lists
        for lst in vertices:
            lst = sorted(lst)
        # Perform DFS
        visited = set()
        def recurse(a):
            for b in vertices[a]:
                if not (a, b) in visited:
                    yield ((a,b))
                    # Make sure this edge is not visited anymore in either direction
                    visited.add((a,b))
                    visited.add((b,a))
                    for edge in recurse(b):
                        yield edge
        for edge in recurse(start_node):
            yield edge
    else: #BFS
        # Collect the edges
        visited = set()
        queue = [start_node]
        while len(queue):
            for a in queue: # Process BFS level by order of id
                level = []
                for b in vertices[a]:
                    if not (a, b) in visited:
                        yield ((a,b))
                        # Add to next level to process
                        level.append(b)
                        # Make sure this edge is not visited anymore in either direction
                        visited.add((a,b))
                        visited.add((b,a))
            queue = sorted(level)


edgeLst = [('123','234'),
('123','456'),
('123','789'),
('456','765'),
('456','789'),
('234','765')]

print (list(sorted_edges(edgeLst, 'DFS', '123')))

在Python 3中,您可以簡化:

for edge in recurse(b):
    yield edge

至:

yield from recurse(b)

...和start_node相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM