实现 Kosaraju 的算法来检测边缘列表中的循环

问题描述 投票:0回答:0

我将在这个链接中关闭伪代码,但我似乎无法让它工作以检测 SCC 或任何循环。尝试检测边缘列表中的循环任何帮助表示赞赏。

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        if len(prerequisites) == 0:
            return True
            
        adj = defaultdict(list)
        inv = defaultdict(list)
        for i, j in prerequisites:
            if i ==j: return False
            adj[j].append(i)
            inv[i].append(j)
        
        topo = []
        visited = set()
        def toposort(head):
            if head in visited: return
            visited.add(head)
            for neighbor in adj[head]:
                toposort(head)
            topo.append(head)
        
        for i in range(numCourses):
            toposort(i)

        assigned = set()
        scc = defaultdict(list)

        def kos(u, root):
            if u in assigned: return
            assigned.add(u)
            scc[root].append(u)
            for neighbor in inv[u]:
                kos(neighbor, root)
        
        for i in reversed(topo):
            kos(i, i)
        print(scc)
        return max(len(v) for v in scc.values()) <= 1
python directed-acyclic-graphs directed-graph
© www.soinside.com 2019 - 2024. All rights reserved.