用了一点拓扑排序的思想,就是得先确定每个节点的出度和入度。始发节点一定是入度为0的节点,随后需要对始发节点的出度做排序,出度越高越可能把全部节点遍历完,所以优先开始bfs。
class Solution:
def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
indegree = [0 for _ in range(n)]
outdegree = [0 for _ in range(n)]
graph = collections.defaultdict(list)
for a, b in edges:
graph[a].append(b)
outdegree[a] += 1
indegree[b] += 1
meet = set()
def bfs(node, meet):
que = collections.deque()
que.append(node)
while que:
size = len(que)
for _ in range(size):
curnode = que.popleft()
for nextnode in graph[curnode]:
if nextnode not in meet:
meet.add(nextnode)
que.append(nextnode)
que = []
for node in range(len(indegree)):
if indegree[node] == 0:
heapq.heappush(que,(-outdegree[node], node))
res = []
while que and len(meet) != n:
_, node = heapq.heappop(que)
bfs(node, meet)
res.append(node)
return res